对JAVA中private的一点看法,高手请进!

Northwindrocker 2003-01-29 11:52:23
JAVA中当成员声明为private时子类不能继承这是一个常识。但看下面代码我有点疑惑!class Foo2{
protected class Bar{
protected Bar(){
System.out.println("Foo2.bar");
}
}
private Bar b;
Foo2(){
System.out.println("Foo");
b=this.new Bar();
}
}

public class FooToo1 extends Foo2{
protected class Bar{
protected Bar(){
System.out.println("Footoo.bar");
}
}
public static void main(String[] args){
new FooToo1();
}
}
我们可以看见在Foo2中有private的成员b当我们通过FooToo1继承Foo2,并在MAIN中实例化FOOTOO1运行的结果是
Foo
Foo2.bar产生这样的结果是FOOTOO1的构造函数引用父类构造函数注意父类构造函数中
b=this.new Bar();
这个时候实例BAR再引用BAR构造函数写出Foo2.bar这里奇怪的是在FOOTOO1中应该没有B因为它是父类的私有成员。出现这样的结果我想只能是1、在实例化子类时先实例化父类通过父类的无参数构造函数,那么也可以说在实例化FOOTOO1时其父类FOO2实际上已经隐藏的实例化了。2、可能FOOTOO1已经继承了B只是它是父类私有的在FOOTOO1中没有任何办法访问它。
我个人比较倾向于第一种看法。希望高手指点,和大家探讨!
...全文
117 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyqiang 2003-04-26
  • 打赏
  • 举报
回复
我想应该从执行的角度来分析
先从渎函数
----》
默认的构造函数---》
父类的构造函数--》
差不多就完了
分析一下的确是那答案
井中老男孩 2003-04-25
  • 打赏
  • 举报
回复
就是这样,prinate 只是限制你在子类种不能访问他,但并不代表内存种没有

DavidBone 2003-04-20
  • 打赏
  • 举报
回复
up
somejava 2003-02-26
  • 打赏
  • 举报
回复
说得好专业,我完全没搞懂
colors 2003-02-25
  • 打赏
  • 举报
回复
up
shine333 2003-02-25
  • 打赏
  • 举报
回复
imho,private的东西其指针所指的内容对于其他类是不可访问的,
而且即使是可以访问的,也不是存在子类中

-------------------parent----------------
private
public

----------------child-----
--------------------------

mei dian le
liuxiahao 2003-02-24
  • 打赏
  • 举报
回复
子类对象生成时,子类的构造函数会默认调用父类的构造函数,
而对于父类中所定义的this.new bar(),因为Bar()类对象b是private的,所以编译时绑定,他是父类中Bar()的对象,而不是子类中Bar()的对象
Northwindrocker 2003-02-15
  • 打赏
  • 举报
回复
carrysilence(jafler), wanas(星子)的解释较有说服力。
wanas 2003-02-14
  • 打赏
  • 举报
回复
这样解释吧:子类的创建是先创造一个父类实例,然后再在这个实例上
加上子类特有的东西.所以说子类的实例中有父类的一切内容,但是
子类无法直接访问.需要的话,应该使用父类提供的一个public方法
间接访问.
class father
{
public int Readx()
{
return x
}

private int x
}
class son exends father
{

//int y=readx;
//print y

}
fanciex 2003-02-12
  • 打赏
  • 举报
回复
子类中没有父类的私有成员,只有子类新申明的私有成员,但会初始化父类,初始化父类时可能会用到父类自己的私有成员。
carrysilence 2003-02-09
  • 打赏
  • 举报
回复
楼主为什么不看看大学教材 <面向对象程序设计> 看清华版的就可以了.
问题多多呀.

你问的是最基本的问题了.
但是解答了,也没有意义,不小心就被断章取义了.

那本书挺好懂,看几个小时,就都没有问题了.


至于继承 ,父类中的私有变量在子类中不再被允许访问,虽然存在.
你可以做public 方法去访问这些私有变量.

另外,构造一个子类的时候,如果调用super方法,是一定会生成一个隐含的父类的.这个隐含对象也是有说法的.

所以你的疑问两点都对.
fgump 2003-02-09
  • 打赏
  • 举报
回复
我有个问题,new FooTool();先调用父类Foo2的构造函数,其中调用了b=this.new Bar();,此时this指针应该是指向FooTool啊,为什么还是调用了父类Foo2的Bar函数?
Northwindrocker 2003-02-08
  • 打赏
  • 举报
回复
xazdl(某年某月某日) 你对构造函数的调用说的很清楚!我在这里更关心的是子类中是否有父类的私有成员!我的看法是没有但通过调用隐含的SUPER()会初始化父类!
xazdl 2003-02-06
  • 打赏
  • 举报
回复
请注意JAVA中类继承的机制和运行时虚拟机的装载机制。
如果A extends B, 在运行B时, 应该首先运行A的构造方法: 主要有3种情况:
1.隐式调用, 由虚拟机创建一个A的默认构造方法
class A{
}
class B extends A{
B() {
}
}
2.显式调用, 又分有参数和无参数2种
无参数:
class A{
A(){}
}
class B extends A{
B() {
}
}
有参数:
class A{
A(String param) {
}
}
class B extends A{
B() {
super("hello");
}
}

从构造方法的调用可以看出, 当B运行前首先必须运行A的一个构造方法,在这个方法体的所有的语句其范围只能是在类A里面。

因此Northwindrocker (北风) 所举的例子的结果只能是
----------------------------
Foo
Foo2.bar
---------------------------

再举个例子也许能看的更明白一些。
class Foo2{
private String b = "hello";
protected String c = "hello";
Foo2(){
System.out.println("Foo");
System.out.println("b= " + b);
System.out.println("c= " + c);
}
}

public class FooTool extends Foo2{
private String b = "byebye";
protected String c = "byebye";
public static void main(String[] args){
new FooTool();
}
}
h3wolf 2003-01-30
  • 打赏
  • 举报
回复
这里奇怪的是在FOOTOO1中应该没有B?
记得在《C++ Primer》里有1名话,说“父类实例是子类实例的1个组件”,所以是有b的
nettman 2003-01-30
  • 打赏
  • 举报
回复
不过我不是高手,呵呵~~!
nettman 2003-01-30
  • 打赏
  • 举报
回复
同意第一种看法。

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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