Java中有关子类访问父类成员

Java寻找属性的顺序过程

对象创建

在new一个子类对象的时候,首先会先new一个父类对象,然后将子类新增的属性套在父类对象外面

image-20211019125340987

获取属性途径

①通过属性名直接获取

会从最外层向里逐层寻找,直至找到属性结束、或者遇到private终止

②通过方法获取对象的方法

本文讨论的是第②种,通过方法获取属性的情况

关于父类私有属性的访问

在java中,子类是可以继承父类的私有属性的,但是不可以直接访问(需要通过方法或者super.父类方法)

此时,需要分两种情况考虑:

父类的操作成员属性的方法没有被重写:

没有被重写时,可以直接通过子类调用继承自父类的public属性的方法,获取到父类的私有属性

image-20211019124501145

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()); //输出zhangsan
}
}

父类操作成员属性的方法被重写:

image-20211019124630193

情况一:重写方法后,如果使用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(); //重写方法后,要想调用父类的属性,就需要使用super关键字
}
}
/**
* 测试类
*/
public class T {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("zhangsan");
System.out.println(dog.getName()); //输出zhangsan
}
}

情况二:如果使用的是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; //使用this关键字,就需要有这个name属性存在
//没有重写父类的方法
@Override
public String getName() {
return this.name; //使用this关键字,调用的是套在父类外面的属性
}
}
/**
* 测试类
*/
public class T {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("zhangsan"); //这里是给父类中的属性进行了赋值
System.out.println(dog.getName()); //输出null
}
}

总结

不论是private修饰父类的属性,还是public修饰父类的属性,都需要先看一下父类的方法有没有被子类重写;如果重写,则需要看使用的是this关键字,还是super关键字,this获取和操作父类外面的属性,super获取和操作父类里面的属性。如果没有被重写,调用的方法都是父类的public修饰的方法,因此也就是对父类的属性获取和操作。

image-20211019131731555

Contents
  1. 1. Java寻找属性的顺序过程
    1. 1.1. 对象创建
    2. 1.2. 获取属性途径
  2. 2. 关于父类私有属性的访问
    1. 2.1. 父类的操作成员属性的方法没有被重写:
    2. 2.2. 父类操作成员属性的方法被重写:
      1. 2.2.1. 情况一:重写方法后,如果使用super关键字,是获取或者操作父类的属性,
      2. 2.2.2. 情况二:如果使用的是this关键字,获取或操作的是套在父类外面的属性
  3. 3. 总结
|