java继承中,为什么成员变量可以隐藏,而方法不可以了?反过来,为什么方法可以覆盖而成员变量不可以了?

一起来玩玩呗 2012-10-05 12:17:04
如题:
希望各位大牛们,多说点啊
...全文
406 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2012-10-08
  • 打赏
  • 举报
回复
确认的

There are methods that a subclass cannot override. For example, in Java, a method that is declared final in the super class cannot be overridden. Methods that are declared private or static cannot be overridden either because they are implicitly final. It is also impossible for a class that is declared final to become a super class.

http://en.wikipedia.org/wiki/Method_overriding
hheeyyii 2012-10-08
  • 打赏
  • 举报
回复
因为就是这么定义的,11楼说的正确,所以属性经常需要定义成private xx;

public void setXXX(){}
public xx getXXX(){}


dracularking 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 10 楼 的回复:

引用 8 楼 的回复:

1. 关于LZ提的类似名字重用的问题,我觉得可以从什么是继承、什么是属性、什么是方法考虑。
子类可以隐藏父类的成员变量;覆写父类的方法:
因为隐藏不是覆盖,父类的成员变量还是被继承过来了,只是被隐藏了;
如果换种提法:子类的成员变量覆盖父类的成员,显然子不类父啊!

2. 子类的静态方法是可以隐藏其父类同名的静态方法的。……
[/Quote]
对,那类似地,对覆盖(Override)来说,是不是就访问不到了?
沈家大帅 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 8 楼 的回复:

1. 关于LZ提的类似名字重用的问题,我觉得可以从什么是继承、什么是属性、什么是方法考虑。
子类可以隐藏父类的成员变量;覆写父类的方法:
因为隐藏不是覆盖,父类的成员变量还是被继承过来了,只是被隐藏了;
如果换种提法:子类的成员变量覆盖父类的成员,显然子不类父啊!

2. 子类的静态方法是可以隐藏其父类同名的静态方法的。

我觉得隐藏和覆盖只是一个分……
[/Quote]
把子类的对象强制转换成父类类型,然后看能不能调用到其被隐藏的的属性或方法。
参考,子类可以继承父类的私有属性http://blog.csdn.net/naruto_ahu/article/details/8044887
class Base{
public int a = 1;
public void fun(){
System.out.println("Base fun()");
}
public static void staticf(){
System.out.println("Base staticf()");
}
}
public class Derived extends Base {
public int a=2; //会隐藏Base.a
@Override
//下面实例方法会覆写超类中可访问到的具有相同签名的实例方法[JLS 8.4.8.1],不是隐藏
public void fun(){
System.out.println("Derived fun()");
}
//@Override
//下面静态方法会隐藏超类中可访问到的具有相同签名的静态方法
public static void staticf(){
System.out.println("Derived staticf()");
}
public static void main(String[] args) {
Derived test = new Derived();
//测试test对象的属性和方法
System.out.println("test.a = "+test.a);
System.out.println("((Base)test).a = "+((Base)test).a);
((Base)test).fun();
test.staticf();
((Base)test).staticf();
}
}
装逼之王 2012-10-07
  • 打赏
  • 举报
回复
静态方法只能隐藏而无法覆盖!!!!
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
成员变量是 private 的啊,你把方法弄成 private 的话,那子类也是不能重写的
[/Quote]
+1
一起来玩玩呗 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
我的理解是这样的
成员变量的选择是通过静态绑定的,也就是在编译期间决定,也就是通过引用变量决定,而不是通过实际对象决定,
比如
class A{
public int t; //为了突出问题,所以这里用Public
}
class AA extends A{
public int t;
}
那么
A a = new AA();
那么这个时候,a就是引用变量,真正的对……
[/Quote]
当初看到继承的时候突然间冒出的疑问。自己想了会,没有答案,于是就贴出来了,希望各位多多发表下意见,小弟我学习了。
CHZiroy 2012-10-06
  • 打赏
  • 举报
回复
我的理解是这样的
成员变量的选择是通过静态绑定的,也就是在编译期间决定,也就是通过引用变量决定,而不是通过实际对象决定,
比如
class A{
public int t; //为了突出问题,所以这里用Public
}
class AA extends A{
public int t;
}
那么
A a = new AA();
那么这个时候,a就是引用变量,真正的对象时new AA()创造的对象,成员变量的选择是由引用类型决定
这个时候,a.t就是代表父类中的成员变量,
这就是所谓的静态绑定,所以也就是出现了隐藏,相同道理,static方法也有隐藏的现象,
而普通的方法,则是动态绑定了,也就是由对象类型决定,而不是引用类型决定了,这就是哦我们平时所说的多态
楼主,可以不用给太多分的
dracularking 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

1. 关于LZ提的类似名字重用的问题,我觉得可以从什么是继承、什么是属性、什么是方法考虑。
子类可以隐藏父类的成员变量;覆写父类的方法:
因为隐藏不是覆盖,父类的成员变量还是被继承过来了,只是被隐藏了;
如果换种提法:子类的成员变量覆盖父类的成员,显然子不类父啊!

2. 子类的静态方法是可以隐藏其父类同名的静态方法的。
[/Quote]
我觉得隐藏和覆盖只是一个分类的概念,本质在某种程度上可能没什么不同

有没有确凿的证据证明隐藏(Shadowing)只是隐藏,就是说还是继承过来了(变量可能还好证明,因为变量可以只是在一个类的部分区域被隐藏,但对于静态方法的隐藏怎么证明呢),而覆盖却是覆盖了,没有继承过来?
一起来玩玩呗 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
1. 关于LZ提的类似名字重用的问题,我觉得可以从什么是继承、什么是属性、什么是方法考虑。
子类可以隐藏父类的成员变量;覆写父类的方法:
因为隐藏不是覆盖,父类的成员变量还是被继承过来了,只是被隐藏了;
如果换种提法:子类的成员变量覆盖父类的成员,显然子不类父啊!

2. 子类的静态方法是可以隐藏其父类同名的静态方法的。
[/Quote]
貌似有点懂了
沈家大帅 2012-10-06
  • 打赏
  • 举报
回复
1. 关于LZ提的类似名字重用的问题,我觉得可以从什么是继承、什么是属性、什么是方法考虑。
子类可以隐藏父类的成员变量;覆写父类的方法:
因为隐藏不是覆盖,父类的成员变量还是被继承过来了,只是被隐藏了;
如果换种提法:子类的成员变量覆盖父类的成员,显然子不类父啊!

2. 子类的静态方法是可以隐藏其父类同名的静态方法的。
zly361814478 2012-10-06
  • 打赏
  • 举报
回复
第一个问题。当父类把方法用private修饰了, 这算不算隐藏了父类的方法???
第二个问题,方法可以覆盖,当你子类定义的成员变量和父类的成员变量同名同类型的时候,这算不算覆盖??
调用的时候如果想调用父类的成员变量得加上super关键字。
a363722188 2012-10-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:
应该跟他们的存放方式有关吧。。。。

可以具体地解释下吗
[/Quote]

个人理解是成员变量放在栈中,而方法放堆中。
一起来玩玩呗 2012-10-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
首先要弄清楚继承,一个类,有成员变量和方法,要看看它们各自的修饰符,如果这个变量或者方法是private,无论如何我都是自己来用的,其它类是无法调用的。
[/Quote]
你还不知道我的问题是什么,对于继承的概念我都理解,只是不明白为什么继承中对成员变量隐藏而对方法却是覆盖,而不是隐藏?为什么要这样做了?有什么目的吗?
Sweeter 2012-10-05
  • 打赏
  • 举报
回复
首先要弄清楚继承,一个类,有成员变量和方法,要看看它们各自的修饰符,如果这个变量或者方法是private,无论如何我都是自己来用的,其它类是无法调用的。
  • 打赏
  • 举报
回复
成员变量是 private 的啊,你把方法弄成 private 的话,那子类也是不能重写的
一起来玩玩呗 2012-10-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
应该跟他们的存放方式有关吧。。。。
[/Quote]
可以具体地解释下吗
a363722188 2012-10-05
  • 打赏
  • 举报
回复
应该跟他们的存放方式有关吧。。。。

62,616

社区成员

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

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