protected修饰的成员在子类中怎么不能访问?代码如下

程猿薇茑
Java领域优质创作者
博客专家认证
2014-04-10 08:46:47

package zpc.databaseTest;
public class Father {
private String name="";
private int a=12;;
protected void test1(){
System.out.println("name="+name);
}

public void test2(){
System.out.println("2="+test3());
}
private int test3(){
return 2;
}
}

package TinkingJava;
import zpc.databaseTest.Father;
public class Son extends Father{
public static void main(String[] args){
Father f=new Father();
f.test1();//test1()是protected的啊

Son s=new Son();
s.test1();//这里不报错
s.test2();
//s.test3();//private的当然不能访问
}

}
...全文
1650 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Laser光 2016-07-14
  • 打赏
  • 举报
回复
protected具体意义是子类对象可以访问.而不是子类定义的内部可以访问。在子类内部直接写属性名实际是this.属性名.也就是当前子类对象访问的protected属性.应该这么理解才对 而你写的创建的是一个父类对象.所以包外不能访问
诺浅 2015-06-25
  • 打赏
  • 举报
回复
引用 16 楼 u011201384 的回复:
protected是指子类继承父类时,可以被子类继承的部分。在子类内部可以调用,new 以后属于外部。new 后如果不在同包下就不能访问。
这楼说的才是对的,楼主这样写就可以了。 public static void main(String[] args){ test1();//test1()是protected的啊 Son s=new Son(); s.test1();//这里不报错 s.test2(); //s.test3();//private的当然不能访问 } 直接写test1();
程猿薇茑 2014-04-11
  • 打赏
  • 举报
回复
引用 4 楼 pingchangxinli 的回复:
把LZ的代码拷贝到本地测试通过,只是类所在的包不同,没报错,还是把 错误拷贝出来看下。
就是想测试不同包的情况下protected的效果
程猿薇茑 2014-04-11
  • 打赏
  • 举报
回复
引用 3 楼 pingchangxinli 的回复:
你确定是方法报错?
引用 8 楼 m529031854 的回复:
权限问题,其它包不可以用!
protected修饰的变量可以在另外一个包中引用啊,只要那个类是定义protected成员的类的子类。这不是proected的定义吗? 确定报错,错误提示把test1()改成protected,但是本来就是protected的啊! 难道编译器的问题?
引用 7 楼 u011497426 的回复:
没搞懂 表示明天去问老师,只是你的Son既然都继承了Father ,为怎么还要建Father 的对象呢,需求是这样的么?
这个问题好。不是需求,只是实验
程猿薇茑 2014-04-11
  • 打赏
  • 举报
回复
引用 11 楼 whos2002110 的回复:
[quote=引用 10 楼 zpcandzhj 的回复:] [quote=引用 4 楼 pingchangxinli 的回复:] 把LZ的代码拷贝到本地测试通过,只是类所在的包不同,没报错,还是把 错误拷贝出来看下。
就是想测试不同包的情况下protected的效果[/quote] 子类能调用test1()是因为子类有test1方法且在访问权限内, 父类不能调用是因为不在访问权限内! 你帖子的问题跟你代码表达的疑惑完全没关系,所以你基本概念没弄清楚[/quote] 父类怎么就不在访问权限内了?test1()在Father类定义了啊
引用 12 楼 u012301841 的回复:
访问控制权限 作用范围: 当前类 同一个包 其他package 同包子孙类 不同包子孙类 public 可以 可以 可以 可以 可以 protected 可以 可以 不可以 可以 可以 default 可以 可以 不可以 可以 不可以 private 可以 不可以 不可以 不可以 不可以 lz看看上面的访问权限,你的程序是不同包的。package zpc.databaseTest;和package TinkingJava;访问当然会出错。
不同包不错,但是没看到test1是protected的吗
引用 14 楼 g373984011 的回复:
[quote=引用 13 楼 g373984011 的回复:]

 protected void test1(){
        System.out.println("name=");
    }
这样试试~~~~嘿嘿
不好意思 刚刚看错题了~~~ 你这属于编译错误吧?? protected修饰的属性、方法只能在同一个包的情况下访问,看你的package,很明显不在一个包里~~~ [/quote] protected修饰的不是只能在一个包才能访问,另外一个包的子类可以,看书!
引用 18 楼 lxbccsu 的回复:
其实你迷惑是因为你 只看到了 protected修饰的字段或方法允许被子类访问; 却没理解另一个很重要的一个限制:在子类中,该子类中的方法只能用 该子类对象访问protected修饰的字段或方法,而不能用 父类对象或该父类派生的其它子类对象 访问protected修饰的字段或方法;当然这里是在不同的包中;还有就是在对象方法中用super调用父类方法,如super.test1()等,其实这样调用还是限制在该子类的对象方法中; 用你的示例来说就是:在Son类中,Son中的方法只能用 Son对象 访问protected修饰的字段或方法; 还要注意:编译时变量用的是声明的类型;
貌似是正解!
m529031854 2014-04-11
  • 打赏
  • 举报
回复
权限问题,其它包不可以用!
lxbccsu 2014-04-11
  • 打赏
  • 举报
回复
其实你迷惑是因为你 只看到了 protected修饰的字段或方法允许被子类访问; 却没理解另一个很重要的一个限制:在子类中,该子类中的方法只能用 该子类对象访问protected修饰的字段或方法,而不能用 父类对象或该父类派生的其它子类对象 访问protected修饰的字段或方法;当然这里是在不同的包中;还有就是在对象方法中用super调用父类方法,如super.test1()等,其实这样调用还是限制在该子类的对象方法中; 用你的示例来说就是:在Son类中,Son中的方法只能用 Son对象 访问protected修饰的字段或方法; 还要注意:编译时变量用的是声明的类型; 你还可以新建个包,再创建个子类,这样就能更清楚了解了: 如: public class Son1 extends Father{ public static void main(String[] args) { Father f = new Son1(); f.test1(); Son son = new Son(); son.test1(); Son1 son1 = new Son1(); son1.test1(); } }
郑涛 2014-04-11
  • 打赏
  • 举报
回复
protected和包没关系,和包有关系的是default main在类A里面,A的private方法都能调用, 因为main是属于这个类的,它的权限范围自然就是A本身,A本身不能调用父类的private方法,但能调用protected方法. 楼主把main移动其他地方去,就是你想象的
yueyuexiong 2014-04-11
  • 打赏
  • 举报
回复
protected是指子类继承父类时,可以被子类继承的部分。在子类内部可以调用,new 以后属于外部。new 后如果不在同包下就不能访问。
藏于天地 2014-04-11
  • 打赏
  • 举报
回复
我认为你对protected权限的了解有误; protected 表明被它修饰的成员变量和方法为保护类型,在同一个包里和 public 类型是一样的,也是能够访问到的。但是如果在不同包里的 protected 类型的成员变量就只能通过子类来访问,这个修饰符是区别于其他的修饰符的。 子类之所以可以访问是因为,子类继承了父类,这些属性和方法相当于也继承过来了,等同于相同包下的访问 这是我的理解,我也学习没多久,希望对你有帮助......
  • 打赏
  • 举报
回复
引用 13 楼 g373984011 的回复:

 protected void test1(){
        System.out.println("name=");
    }
这样试试~~~~嘿嘿
不好意思 刚刚看错题了~~~ 你这属于编译错误吧?? protected修饰的属性、方法只能在同一个包的情况下访问,看你的package,很明显不在一个包里~~~
  • 打赏
  • 举报
回复

 protected void test1(){
        System.out.println("name=");
    }
这样试试~~~~嘿嘿
  • 打赏
  • 举报
回复
访问控制权限 作用范围: 当前类 同一个包 其他package 同包子孙类 不同包子孙类 public 可以 可以 可以 可以 可以 protected 可以 可以 不可以 可以 可以 default 可以 可以 不可以 可以 不可以 private 可以 不可以 不可以 不可以 不可以 lz看看上面的访问权限,你的程序是不同包的。package zpc.databaseTest;和package TinkingJava;访问当然会出错。
whos2002110 2014-04-11
  • 打赏
  • 举报
回复
引用 10 楼 zpcandzhj 的回复:
[quote=引用 4 楼 pingchangxinli 的回复:] 把LZ的代码拷贝到本地测试通过,只是类所在的包不同,没报错,还是把 错误拷贝出来看下。
就是想测试不同包的情况下protected的效果[/quote] 子类能调用test1()是因为子类有test1方法且在访问权限内, 父类不能调用是因为不在访问权限内! 你帖子的问题跟你代码表达的疑惑完全没关系,所以你基本概念没弄清楚
_-LI川江-_ 2014-04-10
  • 打赏
  • 举报
回复
没搞懂 表示明天去问老师,只是你的Son既然都继承了Father ,为怎么还要建Father 的对象呢,需求是这样的么?
pingchangxinli 2014-04-10
  • 打赏
  • 举报
回复
疏忽了,protected权限问题,关键字提供 包访问权限,子类可以访问。
-江沐风- 2014-04-10
  • 打赏
  • 举报
回复
引用 4 楼 pingchangxinli 的回复:
把LZ的代码拷贝到本地测试通过,只是类所在的包不同,没报错,还是把 错误拷贝出来看下。
在不同的包中这样用肯定会有错; 不能用Father的对象引用;
pingchangxinli 2014-04-10
  • 打赏
  • 举报
回复
把LZ的代码拷贝到本地测试通过,只是类所在的包不同,没报错,还是把 错误拷贝出来看下。
pingchangxinli 2014-04-10
  • 打赏
  • 举报
回复
你确定是方法报错?
-江沐风- 2014-04-10
  • 打赏
  • 举报
回复
protected,表示有条件的限制以保护该成员,当您将类别成员定义为protected之后,继承它的类就可以直接使用这些成员,但这些成员仍然受到对象范围的保护,不可被对象直接使用。 对protected而言:Son extends Father,在子类Son的作用范围内,只能调用Son定义的对象的protected方法(即该方法从父类Father中继承而来); 而不能调用Father类对象的protected 方法:Father f = new Father();
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧