20145329《Java程序设计》第四周学习总结
教材学习内容总结
封装、继承、多态
封装:封装类私有数据,让用户无法直接存取。
继承:
定义:避免多个类间重复定义共同行为,就是相同的代码提升为父类,java中只能继承一个父类。用继承的方式编写代码可以提高代码的弹性。
关键字extends:j继承父类的行为并扩充原本没有的行为。
语法细节:protected:用protected定义的成员,相同包中的类可以直接存取,不同包中的类可以在继承后的子类中直接存取。
java中所有对象一定“是一种”object。如果定义类没有使用extends关键字指定继承任何类,那么一定是继承java.lang.Object。
权限(由小到大):private ->无关键字 ->protected ->public。
多态:
is-a:子类与父类之间是is-a(是一种)关系,编写代码时可以使用is-a检查语法的逻辑是否正确:从=右边往左读,看右边是不是左边的子类。当右边不是左边的子类的时候,程序编译错误,也可能存在检查为右边可能是左边子类的不确定的结果,这时可以执行(Cast)叫程序住嘴语法,错误时抛出ClassCastException.
多态:单一接口操作多种类型的对象。
关系:
封装私有数据使用户不能直接存取,程序代码的相同代码可以定义在父类中,子类可以继承使用,一个父类中的同一个操作接口可能有多个子类使用,子类中的操作内容可以待到父类中调用,同一操作接口操作多个操作内容,称为多态。
重新定义
定义:
在继承父类之后,定义与父类中相同的部署,但是执行的内容不同,操作接口相同,只是方法操作内容不同。
super:
想取得父类中的方法定义,可以在调用方法前,加上super关键字,使用它调用的父类方法不能定义为private。
- 注意:重新定义对于父类中的方法权限,只能扩大不能缩小,并且其他部分必须与父类中方法签署完全一致。
抽象类与接口
抽象类
1.方法区块中没有任何程序代码操作,使用abstract标示该方法为抽象方法,,类中若有方法没有操作,并且标示为abstract,表示类定义不完整,称为抽象类。
2.java中可以使用interface来定义抽象的行为和外观。
3.子类继承抽象类的两种做法:继续标示该方法或者操作抽象方法。
4.为了工作的合理和编写的方便,写程序是可以先创建实例,然后执行go()方法过程中调用抽象方法。
接口
1.implements关键字:类要操作接口,必须使用implements关键字。
- 接口定义方法:操作接口定义的方法或者将该方法标示为abstract.
3.类可以操作两个以上的接口。
4.语法细节:接口的方法没有操作时,一定得是公开且抽象,为方便可省略public abstract.
final关键字
- 定义:限定不想再改变的指定变量值,如果被声明的final没有明确用=指定值,表示延迟对象成员指定。
2.class前用final关键字定义,表示这个类是最后一个了,不再有子类也不能被继承。
equals()
1.equals()方法是Object类有定义的方法,程序代码:
`public boolean equals(Object obj){
return (this==obj);
}`
2.instanceof运算符:判断对象是否由某个类创建,左操作数是对象,右操作数十类。
enum枚举常数
enum可用于定义枚举常数。enum定义了特殊类,继承自java.lang.Enum,由编译程序处理,直接撰写会被拒绝。
教材学习中的问题和解决过程
问题一:
重新定义的意义是什么,既然在父类中定义了操作接口,还需要在子类中定义操作内容,也就是说父类中不定义操作接口,子类中直接定义也可以执行,那么为什么还要在父类中定义呢,这不是与代码实行继承的初衷违背了吗?
解决:没有什么比较清楚的解释,大致书上的意思可能只是说可以把它提上去,没说必须把它提上去。
问题二:
在编译教材P187页Inheritance ConsoleGame.java时因为误把return scanner.nextInt();写成了return Scanner.nextInt();导致编译错误,但是之前说加上@override就不用担心打错字的问题,这是为什么呢?
解释:大致应该跟偷懒是一种,他只是对比之前能读懂那种常见的书写错误,但scanner是关键字,大小写区分不考虑为打错字的范围。
问题三:
编译错误和执行错误到底是什么区别,怎么判断,弄不清。
解决:编译错误差不多就是语法不对,比如你写String str='str'编译就会出错。运行错误是指语法没问题,当时逻辑错误,比如一个方法传进一个String类型的变量str,方法体中有类似于str.equals("str");的语句,但是传进的是一个null,那么这一句就相当于null.equals("str");这肯定会抛空指针异常。
代码调试中的问题和解决过程
1.
错误:java:找不到符号
类型:SwordsMan()
错误:package jdy.cls
解决:上周的问题又犯了,对文件进行了打包,把编译生成的文件和.java文件分类存放了,使得程序调用时找不到相应的文件。
2.
`public class MultiChat {
public static void main(String[] args) {
Client c1=new Client ("127.0.0.1","Caterpillar");
Client c2=new Client ("193.168.0.2","Justin");
ClientQueue queue=new ClientQueue();
queue.addClientListener(new ClientListener(){
@Override
public void clientAdded(ClientEvent event){
System.out.printf("%s 从 %s 联机%n",
event.getName(),event.getIp());
}
@Override
public void clientRemoved(ClientEvent event){
System.out.printf("%s 从 %s 脱机%n",
event.getName(),event.getIp());
}
});
queue.add(c1);
queue.add(c2);
queue.remove(c1);
queue.remove(c2);
}
}
`
错误:(10, 14) java: 找不到符号
符号: 方法 addClientListener(<匿名ClientListener>)
位置: 类型为ClientQueue的变量 queue
解决:还是大小写啊
3.
import java.util.Scanner;
public class ConsoleGame extends GuessGame {
private Scanner scanner=new Scanner (System.in);
@Override
public void print(String text){
System.out.print(text);
}
@Override
public void println(String text){
System.out.println(text);
}
@Override
public int nextInt() {
return Scanner.nextInt();
}
}
错误:java: 无法从静态上下文中引用非静态 方法 nextInt()
解决:把return canner.nextInt();改成return sScanner.nextInt(); Scanner是一种方法,对输入的数扫描的动作,而scanner是对输出的数显示。
本周代码托管截图
学习感悟
之前一直就觉得java是一门理论学习可,但是现在越来越感觉到这是一门语言,就像和韩国人讲韩语一样,我们也是通过java语言和计算机进行交流,把自己的思想通过代码告诉计算机,计算机也会像人一样工作,掌握好java语言,可以让我们的思想得以具体实现。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 50/50 | 2/2 | 20/20 | 实现“HelloWorld” |
第二周 | 100/150 | 2/4 | 20/20 | 学会用IDEA编写代码 |
第三周 | 100/250 | 2/6 | 20/20 | 掌握更多的语法知识 |
第四周 | 150/400 | 2/8 | 20/20 | 学会用Git托管代码 |
参考资料
- [Java学习笔记(第8版
- [《Java学习笔记(第8版)》学习指导]