Java寻找属性的顺序过程
对象创建
在new一个子类对象的时候,首先会先new一个父类对象,然后将子类新增的属性套在父类对象外面
获取属性途径
①通过属性名直接获取
会从最外层向里逐层寻找,直至找到属性结束、或者遇到private终止
②通过方法获取对象的方法
本文讨论的是第②种,通过方法获取属性的情况
关于父类私有属性的访问
在java中,子类是可以继承父类的私有属性的,但是不可以直接访问(需要通过方法或者super.父类方法)
此时,需要分两种情况考虑:
父类的操作成员属性的方法没有被重写:
没有被重写时,可以直接通过子类调用继承自父类的public属性的方法,获取到父类的私有属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
class Animal { private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; } }
class Dog extends Animal { }
public class T { public static void main(String[] args) { Dog dog = new Dog(); dog.setName("zhangsan"); System.out.println(dog.getName()); } }
|
父类操作成员属性的方法被重写:
情况一:重写方法后,如果使用super关键字,是获取或者操作父类的属性,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Animal { private String name;
public String getName() { return name; } public void setName(String name) { this.name = name; } }
class Dog extends Animal { @Override public String getName() { return super.getName(); } }
public class T { public static void main(String[] args) { Dog dog = new Dog(); dog.setName("zhangsan"); System.out.println(dog.getName()); } }
|
情况二:如果使用的是this关键字,获取或操作的是套在父类外面的属性
使用this关键字,调用的是套在父类外面的属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
class Animal { private String name;
public String getName() { return name; } public void setName(String name) { this.name = name; } }
class Dog extends Animal { private String name; @Override public String getName() { return this.name; } }
public class T { public static void main(String[] args) { Dog dog = new Dog(); dog.setName("zhangsan"); System.out.println(dog.getName()); } }
|
总结
不论是private修饰父类的属性,还是public修饰父类的属性,都需要先看一下父类的方法有没有被子类重写;如果重写,则需要看使用的是this关键字,还是super关键字,this获取和操作父类外面的属性,super获取和操作父类里面的属性。如果没有被重写,调用的方法都是父类的public修饰的方法,因此也就是对父类的属性获取和操作。