面向对象
继承
一个类只能继承一个类,不能同时继承多个类,但是一个类可以被多个类继承
!!继承后在子类中会自动创建父类的属性,<不论是什么访问权限>。
重写
- 重新方法的访问权限修饰符一定要不小于被重写方法的访问修饰符(public>protected>default>private)。
- 重写方法的返回值必须和被重写方法的返回值一致或者是原类型的子类
- 重写方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类
- 被重写的方法不能为private,因为默认为fianl无法继承,只是新定义了一个同名方法没有重写
- !!静态方法不能被重写,只能用同名静态方法隐蔽,不会触发多态性
- !!非静态方法不能被重写为静态的方法(会编译出错)
上转型|下转型
父类的变量指向了子类的对象
- 属性隐藏
class Fu{
public String a="fu";
}
class Zi{
public String a="Zi";
}
--------------------------------
Fu fu= new Fu();
Zi zi = new Zi();
System.out.println(f);
System.out.println(d);
System.out.println("------");
fu = zi;
System.out.println(f);
System.out.println(d);
System.out.println(fu.a);//访问父类被隐藏的a数据
–
Fu fu= new Fu();
Zi zi = new Zi();
fu = zi;
也可以写为
Zi zi = new Zi();
Fu fu= zi;
–
结果为
demo.fu@15db9742
demo.Zi@6d06d69c
------
demo.Zi@6d06d69c
demo.Zi@6d06d69c
fu
- 方法重写
class Fu{
public void say() {
System.out.println("Fu");
}
}
class Zi{
public void say() {
System.out.println("Zi");
}
}
--------------------------------
Fu fu= new Fu();
Zi zi = new Zi();
fu = zi;
fu.say();
结果为
Zi
!!下转型,不存在无中生有的下转型,一切的下转型都是上转型的逆操作。
现在的fu变量中 保存的是子类对象的地址,这就是经过上转型的数据
将其转存回zi类中的变量中,就是下转型。下转型需要强制类型转换
zi=(Zi) fu;//下转型,逆操作前面必须要有fu = zi;
如果没有fu = zi;,!!下转型不能无中生有出来。
会出现报错
这不是下转型,这是错误的。
Exception in thread "main" java.lang.ClassCastException: demo.fu cannot be cast to demo.Zi
at demo.Zi.main(Zi.java:24)
可以使用 instanceof 关键字
判断当前对象是否属于某一个类
使用方法:对象 instanceof 类名
if (fu instanceof Zi) {
zi=(Zi) f;
}
fu instanceo
f Zi//的值为false
- 个人理解
public class Father {
String name = "爹";
public void say(){
System.out.println("我是"+name);
}
}
public class Son extends Father {
String name = "儿";
public void say(){
System.out.println("我是"+name);
}
}
- test
Father father = new Father();
System.out.println(father.name);
father.say();
Son son = new Son();
father = son;
System.out.println(father.name);
father.say();
- 结果
爹
我是爹
爹
我是儿