Java学习笔记
构造器总结
注意:创建子类时总会默认调用父类的无参构造器
对象在创建的时候也会默认创建一个无参构造器
多态的复习与总结
1 对象的编译类型和运行类型可以不一致
2 编译类型在初始化对象是就已经确定了,不能够改变
3 编译类型不能改变,但是运行类型可以改变
4 编译类型是初始化对象时候“=”的左边,运行类型是“=”的右边
举例Food food = new Fish("罗非鱼"); food运行类型是Fish,编译类型是food /// food = new bone("大骨头“) 此例中,引用food的运行类型变成了bone,编译类型仍然是food
向上转型调用方法的规则如下
(1)可以调用父类中的所有成员(需遵守访问权限)
(2)但是不能调用子类的特有的成员【因为在编译阶段,能调用哪些成员,是由编译类型来决定的】
animal.catchMouse();错误
(3)最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法,然后调用,规则我前面我们讲的方法调用规则一致。
public class Animal {
String name = "动物";
int age = 10;
public void sleep(){
System.out.println("睡");
}
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
public void show(){
System.out.println("hello,你好");
}
}
public class Cat extends Animal {
public void eat(){//方法重写
System.out.println("猫吃鱼");
}
public void catchMouse(){//Cat特有方法
System.out.println("猫抓老鼠");
}
}
animal.eat();//猫吃鱼.. 子类的具体实现,即调用方法时,从子类开始查找。
animal.run();//跑
animal.show();//hello,你好
animal.sleep();//睡
animal.catchMouse();//会报错,编译类型中不包括catchMouse方法
注意区分:属性调用时看编译类型,方法调用时看运行类型(子类)(前提是父类也有这个方法,也就是子类重写的这个方法)
public class PolyDetail02 {
public static void main(String[] args) {
//属性没有重写之说!属性的值看编译类型
Base base = new Sub();//向上转型
System.out.println(base.count);// ? 看编译类型 10
Sub sub = new Sub();
System.out.println(sub.count);//? 20
}
}
class Base { //父类
int count = 10;//属性
}
class Sub extends Base {//子类
int count = 20;//属性
}
动态绑定机制
1.当调用对象方法的时候,该对象会和该对象的内存地址/运行类型进行绑定
2.当调用对象属性的时候,没有动态绑定机制,哪里声明,哪里使用。