黑马程序员技术交流社区

标题: 关于protected 的用法的小问题 [打印本页]

作者: 于文露    时间: 2011-10-11 19:50
标题: 关于protected 的用法的小问题
package packa;
public class  A
{
        public void show()
        {
                System.out.println("a show run");
        }
}





package packb;
public class B
{
        public  void show()
        {
                System.out.println("b show run");
        }
        protected void method()
        {
                System.out.println("b method run");
        }
}





package packdemo;
class  PackageDemo extends packb.B
{
        public static void main(String[] args)
        {
                packa.A a =new packa.A();
                a.show();
                packb.B b= new packb.B();
                b.show();
                b.method();
        }
}
我建立了三个包,当包packa和包packb编译通过后,我再通过javac命令编译包packdemo
结果却是显示:
C:\Program Files\EditPlus 3>javac -d D:\my=java-classes PackageDemo.javaPackageDemo.java:10: 错误: method()可以在B中访问protected                               b.method();                                                              ^                                                      1 个错误

这是为什么呀?protected 的用法不是这样子么                                                               
作者: 庞金梁    时间: 2011-10-11 20:04
作用域 当前类 同一包 子孙类 其他包
public   √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×

这样给你写出来之后 我想你应该很快就能明白了,
作者: 张洋铭    时间: 2011-10-12 15:04
本帖最后由 张洋铭 于 2011-10-12 15:05 编辑

1. protected范围是,本类中,本包中,以及自己的子类有效。 而且你代码里继承基本就白瞎了,继承完什么也没调用。

2. 你new packb包中B类的对象,然后调用被protected的方法,但问题是protected的可见度是不能跨包,如果你想调用B类的method, 你就直接写method();就可以了,因为你继承了这个方法。
作者: 黄锋    时间: 2011-10-12 16:29
本帖最后由 黄锋 于 2011-10-12 16:29 编辑

protected着实切语义是:protected修饰的措施或变量将会被任何位置的子类继承,然而永远只能被最早定义他的父类所在的包的类所见(除非该类以及其子类能看到本身的该protected措施或变量之外)。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2