java子类对父类继承的属性在不同修饰词下的访问权限
父类中的属性和方法可以被子类继承
子类中继承了父类中的属性和方法后,在子类中能不能直接使用这些属性和方法:和这些属性和方法原有的修饰符(public protected default private)相关。
例如 :
根据父类成员的 访问权限修饰词分为两种情况:
①父类成员域由private修饰,那么在子类中不能直接访问父类成员域,但是可以通过父类中的公共方法访问以及修改父类成员域。如:
class FatherClass{
private int a;
//可以通过公共方法操作父类私有内容
public int geta(){ return a;}
public void seta(int a){this.a=a;}
}
则在子类中可以通过geta获得父类的成员域的值,通过seta修改父类成员域的值
②父类成员由public或protected或default(不写访问权限修饰词),在子类中可以直接访问父类成员域,可以修改继承的父类成员域,但是不能直接修改父类本身的成员域(可以通过上面所说的public void seta(int a){this.a=a;}对父类本身的成员域进行修改),以下是示例代码:
package gunjo.kirito.union.papertest;
class FatherClass {
int a;// 非私有
//注意有继承关系的话,作为父类必须写默认构造
public FatherClass() {
a = 10;// 父类本身的a
}
}
public class ChildClass extends FatherClass {
int a;
public ChildClass() {
this.a = 1;// 子类本身的a
super.a = 100;// 继承的父类a,与父类本身处于不同空间
}
public void show() {
System.out.println("子类的a:" + a);
System.out.println("继承的a:" + super.a);//把上面子类构造中super.a=100注释掉的话,后面打印时继承的a:10
// 此处是继承的父类成员域,而不是父类本身的成员域
}
public static void main(String[] args) {
FatherClass fc = new FatherClass();
System.out.println("父类本身的a:" + fc.a);
ChildClass cc = new ChildClass();
cc.show();
}
}
运行结果:
父类本身的a与子类从父类继承的a占据两个不同的独立的存储空间,在继承之后,他们的值互不相干(继承的时候进行值传递),这样可以避免因为子类中的操作而导致对父类的a的值进行预期结果之外的修改。
另外,
父类中的构造器是不能被子类继承的,但是子类的构造器中,会隐式的调用父类中的无参构造器(默认使用 super关键字)。