对于继承,子类会默认调用父类的构造器,但是如果没有默认的父类构造器,子类必须要显示的指定父类的构造器,而且必须是在子类构造器中做的第一件事。
仍然允许子类的成员来访问它们。这个时候就需要使用到protected。
对于protected而言,它指明就类用户而言,他是private,但是对于任何继承与此类的子类而言或者其他任何位于同一个包的类而言,他却是可以访问的。
看下代码demo:
class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
public String show(A obj) {
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
class E {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();//这样只保留A中的show(D)和B中的show(A);a2只保留了与父类A同名的属性和方法。
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); //①AA
System.out.println(a1.show(c)); //②aa
System.out.println(a1.show(d)); //③ad
System.out.println(a2.show(b)); //④ba
System.out.println(a2.show(c)); //⑤ba
System.out.println(a2.show(d)); // ⑥ad
System.out.println(b.show(b)); //⑦bb
System.out.println(b.show(c)); //⑧bb
System.out.println(b.show(d)); //⑨ad
}
}
其实主要就是在这里:
1. A a1 = new A();
2. A a2 = new B();//这样只保留A中的show(D)和B中的show(A);a2只保留了与父类A同名的属性和方法。
3. B b = new B();
上面这三种形式其中主要就是2这种形式,a2只保留了与父类A同名的属性和方法。相当于把儿子的功能给父亲,这时候父亲只能接受儿子重写父亲的方法,也就是public String show(A obj)覆盖掉父亲的同名方法,儿子原来的public String show(B obj),由于父亲 没有,只能废掉。其他就是正常的的了。
public:可以被所有其他类所访问
private:只能被自己访问和修改
protected:自身、子类及同一个包中类可以访问
default:同一包中的类可以访问,声明时没有加修饰符,认为是friendly。
protected举例:
public class A {
protected int a = 0;
private int ceshia() {
a++;
return a;
}
}
public class B extends A {
public int ceshia(){
a++;
return a;
}
}
解释:B继承A ,B可以使用A中a变量;
java:
还是上面的AB,右键goto,创建一个Test:
public class BTest {
@Test
public void ceshia() {
B b=new B();
int a= b.ceshia();
System.out.println(a);
}
}
点击左侧按钮就能运行了;
android 测试:
选择android: