多态
一种事物有多种称呼,一个对象可以用父类的类型引用,叫多态
多态体现了对象类型的灵活性
注意:在编译期系统认为这个对象的类型是父类类型,在运行期实质是子类对象。
1. 用多态写法的时候,调用父类的方法,不能调用子类独有的方法。
持有你的对象,清楚对象的型别
2. 如果用多态,类型表示的太远,就会有方法的缺失
如果要调用子类对象独有的方法,就要转型
转型
如果要调用子类对象独有的方法,就要转型
类转型异常 ClassCastException
通过 instanceof 的判断 避免转型异常
Object obj = new Person();
if(obj instanceof String) {
String str = (String)obj;
}
public class Movie {
public void play(Person p) {
p.speak();
if(p instanceof Chinese) {
Chinese c = (Chinese)p;
c.comic();
}else if(p instanceof English) {
English e = (English)p;
e.dance();
}else if(p instanceof Japanese) {
Japanese j = (Japanese)p;
j.eat();
}
}
}
equals方法
判断两个对象是否“相等”
-
== 表示比较两个对象的地址是否相同,Object类中的equals方法就是 比较
如果没有重写equals方法 做比较 -
如果要比较两个字符串的内容,用equals比较,因为字符串类重写了equals方法
-
我们可以根据需求重写类的equals方法,完成"相等"的比较
@Override public boolean equals(Object obj) { if(this==obj) { return true; } if(obj instanceof Account) { Account a = (Account)obj; if(this.sfzhm.equals(a.sfzhm)&&this.name.equals(a.name)&&this.accountNo.equals(a.accountNo)) { return true; } } return false; }
static关键字
修饰属性、方法、游离块、内部类
属性:静态的属性,对象是共享的
方法: 调用静态属性\方法时,可以用对象调用或用类名直接调用。
注意:在静态方法\游离块中,只能使用静态的属性,也不能用this关键字。
提示:Cannot make a static reference to the non-static field name
在非静态方法\游离块中,可以使用静态和非静态的属性。
游离块
类中的语句块({内容})
执行顺序:在执行构造器之前,先执行游离块
如果有父类和子类,顺序为 父类游离块--父类构造器--子类游离块--子类构造器
静态游离块
用static修饰的游离块
当类被加载时,执行静态游离块,类加载一次因此静态游离块也只执行一次
如果有父类和子类,顺序为 父类静态游离块--子类静态游离块--父类游离块--父类构造器--子类游离块--子类构造器
final关键字
修饰类、属性、方法
final修饰的类不能被继承
final修饰的方法不能被重写
final修饰的属性不能被修改,且一定要初始化(系统不为对象的final属性初始化)
如果修饰的是引用类型的属性,引用不能修改,但其引用对象的属性是可以修改的。
常量写法规范
public static final String ADDRESS = “192.168.1.1”;