protected修饰符修饰的变量、方法,限制包以外的类对其进行访问。
就是说,在一个类中不能调用其他类的protected变量和方法,要想调用,
必须是public。
关于继承,子类会继承其父类的protected、public变量和方法
所以用super.xx就没问题,因为该方法是他继承父类的成员方法
就是说,在一个类中不能调用其他类的protected变量和方法,要想调用,
必须是public。
关于继承,子类会继承其父类的protected、public变量和方法
所以用super.xx就没问题,因为该方法是他继承父类的成员方法
类变量(对象共享) 类名,对象名点取
类方法 1)static方法中不能直接使用非静态成员, 因
为非静态成员与实例相关,通过对象点取间接使用
2)static方法中不能用this(与实例相关)
3)非static方法中可以使用static成员
static块:和数据成员时并列的位置,用于类初始化
类装入时执行一次(第一次创建对象,第一次使用
static成员,不同的静态块,按在类中的顺序执行)
注:只能修饰成员,不能修饰方法变量.
static方法覆盖时,没有起到覆盖的作用
2, 至于你将变量和方法改为static后,能用test.Tree tmp = new test.Tree(),的tmp引用访问,这种情况实际上就绕开了“可称为对test.Tree类对象的方法调用“,tmp.age能通过与你实例化test.Tree无关,不用new xxx一样行,只要有这句:test.Tree tmp,而age是一个静态字段,不实例化同样存在。
方法outPut()同理。
public class Pine extends test.Tree
{
public static void main(String[] args)
{
test.Tree tmp = new test.Tree();
tmp.outPut();
System.out.println(tmp.age);
}
}
中,你是在Pine中调用Tree的outPut方法,protected限制派生类以外的调用,是指派生类(Pine)可以调用父类(Tree)的protected方法,而不是在派生类中可以用父类(Tree)调用父类本身(Tree)的方法,二你的程序是后者,所以不行。可以改为:
test.Pine tmp = new test.Pine();//派生类
tmp.outPut();//调用父类的保护方法
希望队你有所帮助
D:\work\java\test\Pine.java:13: outPut() has protected access in test.Tree
tmp.outPut();
^
D:\work\java\test\Pine.java:14: age has protected access in test.Tree
System.out.println(tmp.age);另外,wjmmml(笑着悲伤),static的含义我也基本了解,但你最后一句说的“static方法覆盖时,没有起到覆盖的作用”是什么意思?请看我如下的测试: class MrHappyObject
{
MrHappyObject(){}
private String getMood()
{
return "happy";
}
protected static String howDoYouFeel()
{
return "I feel happy!";
}
}
class MrSadObject extends MrHappyObject
{
String add = " sad";
private StringBuffer getMood() //因为private的方法没有继承下来,所以这个的确不是覆盖。
{
return new StringBuffer("sad");
}
/*
如果我用此段方法替换下面的方法体,明显是违反了覆盖的原则;
因此编译也就报错。说不能overridding 一个String返回值得方法为StringBuffer;
public static StringBuffer howDoYouFeel(int a)
{
return new StringBuffer("I feel sad!");
}
*/
public static String howDoYouFeel()
{
return "I feel sad!";
}} class PsychiatristObject
{
public static void main(String[] args)
{
System.out.println("How do you feel, Mr. Happy Object?");
System.out.println(MrHappyObject.howDoYouFeel());
System.out.println("");
System.out.println("How do you feel, Mr. Sad Object?");
System.out.println(MrSadObject.howDoYouFeel());
}
}
运行的结果为:
How do you feel, Mr. Happy Object?
I feel happy!How do you feel, Mr. Sad Object?
I feel sad!
Interactive Session Ended显然Mr. Sad Object的howDoYouFeel()达到了覆盖父类方法的效果。
这难道还不说明static方法是可以被覆盖的么?!另外你说" "是static是什么意思啊?我只知道 是空格的转译码,它和static有关么?
如果我没有测试过,我也认为这是不可能的。当然那我还会有如此迷惑么?
请你测试运行以后再下结论!lbluekey(蓝鸟)的说法我比较赞同,我知道正确的调用应该使用super对象。不过不解的是,当变量和方法改为静态的后(也就是只要类加载就存在,不需实例化),它虽然存在,但访问应该也受protected的保护啊。例如我将他们改为private static;虽然都已是类变量和类方法(不是实例变量和实例方法了);但其他类绝对访问不了的,因此static和访问属性是应该没有关系的,但却有了影响,是不是SUN的JDK的问题啊。
重置是两个方法除了方法体不同,没有别的不同。