java的访问修饰符protected关键字让我很迷惑,网上的很多人业内人士的自我注解也依然没有消除我对这个关键字的认识。
我的疑惑有以下几点:
1:增设protected关键字的初衷,也就是说:这个的“受保护”的原理是什么??
2:在Think in Java中,对protected定义是有误的。
3:protected的作用到底是什么呢?
4:涉及到继承。
在java编程思想中:通过阅读,我的理解是:
关于对有protected访问修饰符的类的继承,可以分为两种情况:
(1)不同包的继承。
书中说:在一个新的包中得类继承原始包中的类,只能访问原始类中的public修饰成员
这里有三种很显著的不能访问:
1)不同包下:在子类中,“父类引用指向子类对象”这种类型的变量是无法访问父类中被protected修饰的变量或者方法的。下面是一个例子:
package com.hjj.base;
public class Cookie {
public Cookie(){
System.out.println("Cookie constructor");
}
protected void bite(){
System.out.println("bite");
}
}
子类代码:
package com.hjj.Father;
import com.hjj.base.Cookie;
public class ChocolateChip extends Cookie {
public ChocolateChip (){
System.out.println("Chocolatechip constructor");
}
public void chomp(){
bite();
}
@Override
public void bite(){
System.out.println("嘿嘿");
}
public static void main(String args[]){
ChocolateChip c = new ChocolateChip();
c.chomp();
c.bite();
/*
下面就是父类引用指向子类对象,但是在c1.bite()回报编译错误
错误是:change visiblity bite() to "protected"
*/
Cookie c1 = new ChocolateChip();//不同包下的:父类引用对象不能访问被protected修饰的变量
c1.bite();//报错句子
}
}
2)第二种情况:不同包下:在子类中,父类的对象不能访问自己的protected变量。(我们看下面的例子)
父类代码:
package com.hjj.base;
public class Cookie {
public Cookie(){
System.out.println("Cookie constructor");
}
protected void bite(){
System.out.println("bite");
}
}
子类代码:
package com.hjj.Father;
import com.hjj.base.Cookie;
public class ChocolateChip extends Cookie {
public ChocolateChip (){
System.out.println("Chocolatechip constructor");
}
public void chomp(){
bite();
}
@Override
public void bite(){
System.out.println("嘿嘿");
}
public static void main(String args[]){
ChocolateChip c = new ChocolateChip();
c.chomp();
c.bite();
//父类对象
Cookie c1 = new Cookie();//不同包下的:父类对象不能访问自己的protected修饰的变量
c1.bite();//还是报错,和上面一样的错误
}
}
3)第三种情况:不同包下:不同的子类,是不能在其他子类中访问父类的protected修饰的变量的,而同一个包下就完全不会出现这样的问题。java语言的迷惑性,这么做到底有什么实际意义呢?
(2)同一个包中的继承:
包中的类对象都可以访问到被protected修饰的成员变量或者方法