- Java继承
java中继承是一个重要的特性,使用继承可以大大提升开发的效率。子类继承父类的所有属性和方法,我个人的理解:子类实际上就是在父类基础上进行封装而得到的一个新类。所以子类应该是继承了父类所以的属性和方法,包括父类的私有属性和私有方法。但是在我周围的一些小伙伴和一些网上科普,却因为子类的实例化对象无法直接调用父类的私有属性和私有方法,认为子类只能继承父类的非私有属性和非私有方法。所以我们来用代码看看实际情况到底是怎样的。
- 父类
首先创建一个父类,父类中有一个私有属性和一个私有方法,一个公有属性和三个公有方法。其中的两个公有方法一个能够调用父类的私有方法,一个能够调用父类的私有属性。
package extens;
public class Father {
private String fprivate = "这是父类的私有属性";
public String fpublic = "这是父类的公用属性";
public Father() {
}
public Father(String fprivate) {
this.fprivate = fprivate;
}
public String getFprivate() {
return fprivate;
}
private void fpprint(){
System.out.println("这是父类的私有方法");
}
public void usePrivate(){
this.fpprint();
}
public void fbprint(){
System.out.println("这是父类的公有方法");
}
}
- 子类
子类比较简单,继承了父类,子类中就只有两个构造方法。
package extens;
public class Son extends Father{
public Son() {
}
public Son(String fprivate) {
super(fprivate);
}
}
- 测试
父类和子类准备好后,我们来创建一个测试类来测试一下子类到底是否继承了父类的私有属性和私有方法。
package extens;
public class Solution {
public static void main(String[] args) {
Son son = new Son();
// 子类拥有父类的公有属性,并且可以调用父类的公有方法
System.out.println(son.fpublic);
son.fbprint();
// 尝试打印父类的私有属性,并且调用父类的私有方法
System.out.println(son.fprivate);//子类对象无法调用父类的私有属性
son.fpprint;//子类对象无法调用父类私有方法
//使用getter方法调用父类私有属性,使用子类对象可调用的父类公有方法调用父类私有方法
// System.out.println(son.getFprivate());
// son.usePrivate();
}
}
我们创建一个子类的实例化对象,对象调用父类的私有属性和私有方法。
可以看到子类对象调用父类的私有属性和父类的私有方法这条语句被标红了,无法进行编译,这是因为在子类是没有权限访问这个私有属性和私有方法。我们在来调用父类的公有方法,来访问私有属性和私有方法试试。
package extens;
public class Solution {
public static void main(String[] args) {
Son son = new Son();
// 子类拥有父类的公有属性,并且可以调用父类的公有方法
System.out.println(son.fpublic);
son.fbprint();
// 尝试打印父类的私有属性,并且调用父类的私有方法
// System.out.println(son.fprivate);//子类对象无法调用父类的私有属性
// son.fpprint;//子类对象无法调用父类私有方法
//使用getter方法调用父类私有属性,使用子类对象可调用的父类公有方法调用父类私有方法
System.out.println(son.getFprivate());
son.usePrivate();
}
}
看看结果:
可以看到,程序编译无问题并且成功调用了父类的私有属性和私有方法。在整个程序中,我们并没有实例化过父类对象,只实例化了一个子类对象。由此可见,子类是继承了父类的私有属性和私有方法,只是子类没有权限直接访问父类的私有属性和私有方法。