Java有 private、protected、public三种修饰符,那在子类中父类的那些属性、方法会被继承呢?经实际测试验证发现父类的所有属性、方法都会被子类继承,只是不同的修饰符在子类的访问存在一些差别
- private 修饰的属性和方法在子类中不能访问,只能通过父类或者父类的方法访问
- private修饰的方法在子类中不能@Override
- protected修饰的方法在子类中可以用@Override重写
- protected修饰的属性可以在子类直接访问
- public 修饰的方法后者属性在子类可以覆盖和访问
上代码,先是父类:
public class People {
private String name ="people";
protected String nickName ="小白云";
public void sayHello(){
getNameByPrivate();
getNameByProtected();
getNameByPublic();
}
private void getNameByPrivate(){
System.out.println(this.getClass().getName() + " getNameByPrivate:" +name);
}
protected void getNameByProtected(){
System.out.println(this.getClass().getName() + " getNameByProtected:" +name);
}
public void getNameByPublic(){
System.out.println(this.getClass().getName() + " getNameByPublic:" +name);
}
public String getName(){
return name;
}
}
子类代码:
public class TomCruise extends People {
private String name ="TomCruise";
/**
* 子类中重写了protected方法,调用时会调用到子类中的方法,可以加上@Override
* 也可以不用加注解,效果都是一样的,@Override只是为了让编译器检查
*/
protected void getNameByProtected(){
System.out.println(this.getClass().getName() + " getNameByProtected:" +name);
/**
* 子类中可以直接访问父类的protected属性
*/
System.out.println(this.getClass().getName() +" " +nickName);
}
/**
* 重写public方法,子类调用时,调用重写的方法,如果不重写,子类是可以调用父类的方法(通过super关键字)
*/
public void getNameByPublic(){
System.out.println(this.getClass().getName() + " getNameByPublic:" +name);
//super.getNameByPublic();
}
/**
* 子类继承了父类的私有属性,但是不能访问,自能通过父类的方法来访问
*/
public void getSuperNameByPublic(){
System.out.println(this.getClass().getName() + " getSuperNameByPublic:" +super.getName());
}
}
测试类及其结果:
public class ExtendMethodTest {
@Test
public void TestPrivateAndProtectedMethod(){
TomCruise tCruise = new TomCruise();
tCruise.sayHello();
tCruise.getSuperNameByPublic();
}
}
测试结果:
com.zengyg.jdk.TomCruise getNameByPrivate:people
com.zengyg.jdk.TomCruise getNameByProtected:TomCruise
com.zengyg.jdk.TomCruise 小白云
com.zengyg.jdk.TomCruise getNameByPublic:TomCruise
com.zengyg.jdk.TomCruise getSuperNameByPublic:people