本人今天在课堂上吃瘪了,有个修饰符protected问题老师说得不是太清楚,之后大家一起讨论也没个结果,因为是远程视频,所以没办法向老师问个明白,希望各位能帮我彻底弄明白,小弟感激之尽
如果赶时间,直接看第3个程序,很简单的一个问题,只是我没弄明白package creazy;public class TestP {//基类
protected static int i = 8;
protected int j = 3;}
package creazy;public class TestP_one {//同一个包中调用,没有问题,很清楚,可以不看了
public static void main(String[] args)
{
TestP one = new TestP();
System.out.println(TestP.i);
System.out.println(one.j);
}}//不同包中的子类调用,在protected的访问权限内,应该没问题的,结果出问题了,傻了,
//讨论了半天,总结出碰到static就用A计划,没碰到就用B计划,崩溃,只好发到网上请教
package jdbc;import creazy.TestP;public class TestP_two extends TestP{
public static void main(String[] args)
{
TestP two = new TestP();
System.out.println(TestP.i);//1,这个可以用基类调用哪个protected成员,
//可以看到去掉extends后就不能调用。
System.out.println(two.j);//2,报错了,不能直接用基类调用protected成员,这个我知道,
//可是为什么上面的可以用基类调用static成员,
//而这个却不行
TestP_two three = new TestP_two();
System.out.println(three.j);//子类可以调用protected成员
}}
总结:protected修饰的成员可以用子类来调用
问题:1,为什么protected static修饰的成员可以直接用基类调用。请教各位大大说清楚,可以一直把这个归结到一个Java基本规则为止,谢谢
2,为什么protected修饰的成员只能通过子类来调用。请教各位大大说清楚,说出来的道理能够不和问题1发生冲突,谢谢
如果赶时间,直接看第3个程序,很简单的一个问题,只是我没弄明白package creazy;public class TestP {//基类
protected static int i = 8;
protected int j = 3;}
package creazy;public class TestP_one {//同一个包中调用,没有问题,很清楚,可以不看了
public static void main(String[] args)
{
TestP one = new TestP();
System.out.println(TestP.i);
System.out.println(one.j);
}}//不同包中的子类调用,在protected的访问权限内,应该没问题的,结果出问题了,傻了,
//讨论了半天,总结出碰到static就用A计划,没碰到就用B计划,崩溃,只好发到网上请教
package jdbc;import creazy.TestP;public class TestP_two extends TestP{
public static void main(String[] args)
{
TestP two = new TestP();
System.out.println(TestP.i);//1,这个可以用基类调用哪个protected成员,
//可以看到去掉extends后就不能调用。
System.out.println(two.j);//2,报错了,不能直接用基类调用protected成员,这个我知道,
//可是为什么上面的可以用基类调用static成员,
//而这个却不行
TestP_two three = new TestP_two();
System.out.println(three.j);//子类可以调用protected成员
}}
总结:protected修饰的成员可以用子类来调用
问题:1,为什么protected static修饰的成员可以直接用基类调用。请教各位大大说清楚,可以一直把这个归结到一个Java基本规则为止,谢谢
2,为什么protected修饰的成员只能通过子类来调用。请教各位大大说清楚,说出来的道理能够不和问题1发生冲突,谢谢
protected int j = 3; 对象属性 子类可以访问,不同包就不行。
应该是这样
//可以看到去掉extends后就不能调用。
i是基类中的静态成员变量,属于类变量,可以直接调用!!!
如果有不同package的类想调用它们,那么这个类必须是定义它们的类的子类,要注意的是在子类中必需通过子类对象调用它们,不能通过定义它们自身来使用,因为它们对另一个package来说是隐藏的。
问题2,只能通过子类来调用,为什么?
protected static int i = 8;
protected int j = 3;
public static void main(String[] args)
{
TestP MyTestP=new TestP();
System.out.println(MyTestP.j);//本类对象可以随意访问这个变量,修饰符protect仅仅是限制别的类对象对它的访问,例如你的第三个类对象}}
还有个小细节没搞清楚:在别的package中导入这个类,就能够new出这个类的对象,那么这个对象访问自家的属性为什么就行不通了呢,课堂上那位老师只说了子类能够调用,可是没说基类的对象为什么就不能调用自家的东西了