java学习笔记2--面向对象编程( 六 )


17.5 练习
/** 练习:子类继承父类?* * 1.若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,* 系统将不可能把父类里的方法转移到子类中 。* * 2.对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,* 这个实例变量依然不可能覆盖父类中定义的实例变量* */public class FieldMethodTest {public static void main(String[] args){Sub s= new Sub();System.out.println(s.count); //20s.display();//20Base b = s;//==:对于引用数据类型来讲,比较的是两个引用数据类型变量的地址值是否一样 。System.out.println(b == s); //trueSystem.out.println(b.count); //10 编译看左边,运行也看左边b.display(); // 20 多态:编译看左边,运行看右边}}class Base {int count= 10;public void display() {System.out.println(this.count);}}class Sub extends Base {int count= 20;public void display() {System.out.println(this.count);}}
17.6 多态是编译时行为还是运行时行为?
多态时运行时行为 。
* 证明见如下:import java.util.Random;class Animal{protected void eat() {System.out.println("animal eat food");}}class Catextends Animal{protected void eat() {System.out.println("cat eat fish");}}class Dogextends Animal{public void eat() {System.out.println("Dog eat bone");}}class Sheepextends Animal{public void eat() {System.out.println("Sheep eat grass");}}public class InterviewTest {public static AnimalgetInstance(int key) {switch (key) {case 0:return new Cat ();case 1:return new Dog ();default:return new Sheep ();}}public static void main(String[] args) {int key = new Random().nextInt(3);System.out.println(key);// 通过使用随机数,可以知道多态时运行时的行为;Animalanimal = getInstance(key);animal.eat();}}
17.7 练习–多态调用的是子类中重写的方法
public class InterviewTest1 {public static void main(String[] args) {Base base = new Sub();base.add(1, 2, 3); //sub_1Sub s = (Sub)base;s.add(1,2,3); // sub_2}}class Base {public void add(int a, int... arr) {System.out.println("base");}}class Sub extends Base {public void add(int a, int[] arr) {System.out.println("sub_1");}public void add(int a, int b, int c) {System.out.println("sub_2");}}
17.8 动态绑定机制(继承也适用) 17.8.1 为什么只有非静态的成员方法有动态绑定机制
因为多态是在重写的基础上实现的,只有非静态方法可以重写,而静态方法和属性都不可以重写,所以只有非静态的成员方法有动态绑定机制 。
17.8.2 定义
17.8.3 使用
对于多态或继承来说,调用成员方法时,执行的是运行时类型的方法(就是子类中重写的方法),如果子类中没有进行重写,就会去调用父类中的方法;如果在调用的方法中还有方法调用,那么还是先执行运行时类型的方法,没有再向上找;
public class DynamicBinding {public static void main(String[] args) {A a = new B();//向上转型System.out.println(a.sum());// 30System.out.println(a.sum1());// 20}}class A {public int i = 10;public int sum() {return getI() + 10;}public int sum1() {return i + 10;}public int getI() {return i;}}class B extends A {public int i = 20;//public int sum() {//return i + 20;//}//public int sum1() {//return i + 10;//}public int getI() {return i;}}
18.类 18.1 类的基本介绍18.2 "=="运算符18.3 ()方法 18.3.1 类中源码
public boolean equals(Object obj) {return (this == obj);}
18.3.2 细节18.3.3 重写()方法
idea中可以使用alt+自动生成;
重写()方法时,如果属性也是自定义类,那么属性所属类中的()方法也要重写;