class Animals { int age = 10; void enjoy() { System.out.println("Animals enjoy!"); } } class Dogg extends Animals { int age = 20; int weight; void enjoy() { System.out.println("Dog enjoy!"); } } public class Test { public static void main(String[] args) { Animals a = new Animals(); a.enjoy(); System.out.println(a.age); Dogg d = new Dogg(); d.enjoy(); System.out.println(d.age); Animals d1 = new Dogg(); d1.enjoy(); System.out.println(d1.age); Dogg s = (Dogg)d1; System.out.println(s.age); } }
因而可知,父类和子类的变量是同时存在的,即便是同名。
子类中看到的是子类的变量,父类中看到的是父类中的变量。
它们互相隐藏,而同名的方法则是实实在在的覆盖(重写)。java
如Animals d1 = new Dogg();
d1便是一个Animals的对象,也是一个Dogg的对象,
那么调用方法时,是根据对象的实际类型调用的,
实际类型是Dogg,因此永远调用子类的方法。this
而访问成员变量就不一样了,它是Animals时,访问的是父类的成员变量,
转型为Dogg的话,访问的就是子类的成员变量了。code
public class CallByValue { Customer c1 = new Customer("张三"); some(c1); System.out.println(c1.name);//结果是李四 Customer c2 = new Customer("赵六"); other(c2); System.out.println(c2.name);//结果是赵六 static void some(Customer c){ c.name = "李四"; } static void other(Customer c){ c = new Customer("王五");//创建新对象指定给c参考,本来参考的对象会被清除 } } class Customer{ String name; public Customer(String name) { this.name = name; } }
Java中只有传值调用,在some方法中,c和c1参考的是同一对象,即c.name修改的是同一对象的变量。
在调用other()方法时,c和c2参考的是同一对象,在c = new Customer("王五")这一句就是要求创建新对象,并指定给c参考,即c和c2变成了两个不一样的对象。对象