static 的 困惑

china_hwj 2008-04-14 09:53:11
package a;

public class A {
public A() {};
protected void display(){};
}
--------------------------------------
package b;

import a.A;

public class B extends A{
public static void main(String[] args) {
B b = new B();
b.display();
A a = new A();
a.display(); //这行报错
}
}

******************************
如果将程序修改:
package a;

public class A {
public A() {};
protected static void display(){}; //加上static
}
------------------------------------------
package b;

import a.A;

public class B extends A{
public static void main(String[] args) {
B b = new B();
b.display();
A a = new A();
a.display(); //正常
}
}
为什么在类A的display()方法前加上static,就可以运行啦?请高手指教
...全文
173 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdman 2008-04-16
  • 打赏
  • 举报
回复
那如果是private static void display(){};
呢?
skyearthsea 2008-04-16
  • 打赏
  • 举报
回复
没有static的代码没有错 自己好好看看
china_hwj 2008-04-15
  • 打赏
  • 举报
回复

因为A类display()方法为protected的,所以在子类B中能使用,又因为A类的display()方法为静态方法,就表示
创建多个A类对象(包括子类对象),在内存中也只有一份存储空间,
所以b对象和a对象调用的是同一个display()方法。
我是这么理解的
xukai_286 2008-04-15
  • 打赏
  • 举报
回复
这个会出错吗?
huanlingpiaohun 2008-04-15
  • 打赏
  • 举报
回复
现在明白了,
这么解释,从访问权限着来说:
protected的访问权限是同一包中的类和不同包的子类(的对象),而不同包中的子类可以访问它必须包含两个条件:
1,在子类中 2,是子类的对象
所以说,类A虽然在子类中,但是它不是子类的对象,它是父类的对象,所以,它没有访问权限,
从static这来说 当父类的成员声明为静态的时候 ,不管你创建多少对象,它只开辟一段内存,因为它是在创建对象之前开辟的,类可以直接访问,但是同时对象也可以访问,而你创建的对象,包括父类,当然也包括子类的对象,所以加上static后谁都可以访问,大概就是这么着理解吧
paradoxchao 2008-04-15
  • 打赏
  • 举报
回复

package a.a;
class A {
public A() {};
protected void display(){};
}
public class B extends A{
public static void main(String[] args) {
B b = new B();
b.display();
A a = new A();
a.display();
}
}

那为什么这样又可以呢?
我其实很低调 2008-04-15
  • 打赏
  • 举报
回复
出现这样的问题的原因是因为类A中的display()方法用了protected修饰符
在第一种情况中,类B继承了类A和A的display()方法,所以在类B中B类型的对象可以调用自己的display()方法。
但类A的protected方法对其不同包子类B来说是不可见的,所以此protected方法对于B类中生成的A类型的对象也是不可见的

正解

对于static,是因为static 是对于类来讲的,所以可以访问,我们所说的protected子类可以访问,说的是子类的对象,而且又是在子类里面。具备这样个才可以说是子类可以访问。对于static,他是对于类来说的。
adriano86426 2008-04-15
  • 打赏
  • 举报
回复
出现这样的问题的原因是因为类A中的display()方法用了protected修饰符
在第一种情况中,类B继承了类A和A的display()方法,所以在类B中B类型的对象可以调用自己的display()方法。
但类A的protected方法对其不同包子类B来说是不可见的,所以此protected方法对于B类中生成的A类型的对象也是不可见的

正解
但是为什么加上static就可以了呢?
huanlingpiaohun 2008-04-15
  • 打赏
  • 举报
回复
实验了一下,肯定不是不可见的原因,
所以1,2楼正解吧应该,标记一下,明天来看
snakexiay 2008-04-14
  • 打赏
  • 举报
回复
出现这样的问题的原因是因为类A中的display()方法用了protected修饰符
在第一种情况中,类B继承了类A和A的display()方法,所以在类B中B类型的对象可以调用自己的display()方法。
但类A的protected方法对其不同包子类B来说是不可见的,所以此protected方法对于B类中生成的A类型的对象也是不可见的
joejoe1991 2008-04-14
  • 打赏
  • 举报
回复
学习。。。。。。。。。。。。。。
haoxiongok 2008-04-14
  • 打赏
  • 举报
回复
static 方法中只能调用父类静态方法,而它本身隶属于类本身,能被全局调用
whmjxa 2008-04-14
  • 打赏
  • 举报
回复
在子类的静态方法中只能调用父类的静态方法

62,623

社区成员

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

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