亲,Father类的sayHello()方法,修饰符是public..... 马虎的要命啊
解决方案 »
- Argo UML怎么用啊?
- 2个Java基础问题
- java程序中的一个问题
- MDI我被JAVA打败系列之二----子窗口在主窗口里最大化后为什么不能显示完全呢
- ROUND_HALF_EVEN,ROUND_HALF_UP,ROUND_HALF_DOWN有什么区别?
- 菜鸟请教!急用!
- JBuilder界面插件1.3.2,####最新####(20030627)
- 如何用java编一个计算器
- 如何正确配置jdk环境?
- A try block must always be followed by a catch block ? 对么???
- Scanner类如何接收自定义类型的对象
- 怎样不输入任何内容,直接按回车继续呢?
重新解释下给您:
首先,子类继承父类,new 子类的过程中会调用父类构造方法,即new 父类。堆内存分配了一块空间,其中包含一个子类对象,且子类对象内包含一个父类对象。在父类定义的方法中调用this.hello(),是从父类对象自身指向其内部的hello()方法。
你可以这样做,在你的代码中,System.out.println(this instanceof Son);下面再加一行:System.out.println(this instanceof Father); 相信这样你可以看明白。来张草图:哈哈
也就是说表面上是子类对象s调用了sayHello方法,应该是还是s->father->sayHello;
所以当this.hello();时也就类似了this->father->hello。
全凭个人理解见解,等待高手的详细解答。
支持!子类通过继承扩展了父类以后,也拥有了和父类完全相同的能力,这里完全是父类实例自己完成的调用。从封装的角度来讲,撇开一切private的东西,才能更准确把握类之间的职责:谁负责干什么。
System.out.println(this instanceof Son);
System.out.println(this instanceof Father);
哪个会是假?多态就是这么玩的啊
System.out.println(this instanceof Son);
System.out.println(this instanceof Father);
哪个会是假?多态就是这么玩的啊
嗯,谢谢,写了个程序测试了一下,的确是这样子。不过这个this相当于我下面程序中的f还是是呢?
class Father
{
}
class Son extends Father
{
}
public class Test{
public static void main(String[] args)throws Exception{
Father f = new Son();
System.out.println(f instanceof Father);//true
System.out.println(f instanceof Son);//true
Son s = new Son();
System.out.println(s instanceof Father);//true
System.out.println(s instanceof Son);//true
}
}
2)关于楼主的问题,我这样理解:当子类继承父类时,子类会继承父类所有的方法(不管这个方法的访问权限是private、protected、public的);只不过在子类自己定义的方法中无法直接去访问继承而来的private方法罢了,但是可以通过继承而来的public及protected方法来间接访问继承而来的private方法。
即可以简单的将子类的方法分为两个版本,一是继承自父类的方法(简称继承版),二是自己定义的方法(简称自定版义版);但是不管是继承版的还是自定义版的方法,它们都是属于这个子类的,所以当子类实例化一个对象去调用这些方法时,这些方法中的this变量肯定指向这个对象本身(只不过访问继承版的private方法时,需要绕一点弯路)将楼主代码简单修改后验证了上面说法,如下:
class Father {
public Father() {
System.out.println("Father");
}
private void hello(Son son) {
System.out.println("hello");
System.out.println(this==son);//输出true,说明this和son引用的是同一个对象
} public void sayHello(Son son) {
System.out.println(this instanceof Son);
this.hello(son);
}
}public class Son extends Father {
public static void main(String[] args) {
Son s = new Son();
s.sayHello(s);
}
}
sayHello()方法中的System.out.println(this instanceof Son);显示TRUE,应该为子类对象,那下一句的this.hello();子类的对象调用父类私有方法怎么解释?
sayHello()方法中的System.out.println(this instanceof Son);显示TRUE,应该为子类对象,那下一句的this.hello();子类的对象调用父类私有方法怎么解释?
正如你所说子类的对象是不能直接调用父类的私有方法,但是却可以间接调用,这里是间接调用,子类和父类指向同一地址空间。
sayHello()方法中的System.out.println(this instanceof Son);显示TRUE,应该为子类对象,那下一句的this.hello();子类的对象调用父类私有方法怎么解释?
正如你所说子类的对象是不能直接调用父类的私有方法,但是却可以间接调用,这里是间接调用,子类和父类指向同一地址空间。
为什么间接就可以了,进入到sayHello方法后,什么发生了改变,导致子类对象可以访问父类私有方法
sayHello()方法中的System.out.println(this instanceof Son);显示TRUE,应该为子类对象,那下一句的this.hello();子类的对象调用父类私有方法怎么解释?
正如你所说子类的对象是不能直接调用父类的私有方法,但是却可以间接调用,这里是间接调用,子类和父类指向同一地址空间。
为什么间接就可以了,进入到sayHello方法后,什么发生了改变,导致子类对象可以访问父类私有方法已经在上面提到了,你在加一句System.out.println(this instanceof Son);答案也是true。 另外,没什么变化,看图,this引用是从父类的对象指向自己的方法。
sayHello()方法中的System.out.println(this instanceof Son);显示TRUE,应该为子类对象,那下一句的this.hello();子类的对象调用父类私有方法怎么解释?
正如你所说子类的对象是不能直接调用父类的私有方法,但是却可以间接调用,这里是间接调用,子类和父类指向同一地址空间。
为什么间接就可以了,进入到sayHello方法后,什么发生了改变,导致子类对象可以访问父类私有方法已经在上面提到了,你在加一句System.out.println(this instanceof Son);答案也是true。 另外,没什么变化,看图,this引用是从父类的对象指向自己的方法。额,是加一句System.out.println(this instanceof Father);答案也是true
sayHello()方法中的System.out.println(this instanceof Son);显示TRUE,应该为子类对象,那下一句的this.hello();子类的对象调用父类私有方法怎么解释?System.out.println(this instanceof Father); 也会显示true的。内存解析
在sayHello()中添加这句System.out.println(this.getClass().getName());就会得到很明确的结果
子类通过继承得到公共方法,而操作是在父类的方法中完成的。子类只负责调用父类的那个方法,除非你覆盖它。
这样并没有破坏封装,因为子类仍然不能调用父类的私有方法。
sayHello()方法中的System.out.println(this instanceof Son);显示TRUE,应该为子类对象,那下一句的this.hello();子类的对象调用父类私有方法怎么解释?
正如你所说子类的对象是不能直接调用父类的私有方法,但是却可以间接调用,这里是间接调用,子类和父类指向同一地址空间。
为什么间接就可以了,进入到sayHello方法后,什么发生了改变,导致子类对象可以访问父类私有方法
你直接用子类对象调用父类私有方法,会提示这个方法不可见,这是封装特性,对外不可见。进入sayHello方法,那是父类的方法,这时sayHello没有被重写,所以调用的是父类的方法,在父类方法中调用父类自己的方法(私有方法也可调用),即使this是子类对象,这时可见了,或者说找到地址了
sayHello()方法中的System.out.println(this instanceof Son);显示TRUE,应该为子类对象,那下一句的this.hello();子类的对象调用父类私有方法怎么解释?
正如你所说子类的对象是不能直接调用父类的私有方法,但是却可以间接调用,这里是间接调用,子类和父类指向同一地址空间。
为什么间接就可以了,进入到sayHello方法后,什么发生了改变,导致子类对象可以访问父类私有方法
你直接用子类对象调用父类私有方法,会提示这个方法不可见,这是封装特性,对外不可见。进入sayHello方法,那是父类的方法,这时sayHello没有被重写,所以调用的是父类的方法,在父类方法中调用父类自己的方法(私有方法也可调用),即使this是子类对象,这时可见了,或者说找到地址了
可不可以这样理解,父类的私有方法对子类不可访问是在编译的时候限制的,但是执行的时候,是不会限制的
System.out.println(this instanceof Son);
this.hello();
}
}
因为Son跟Father存在继承关系,所以用instanceof来判断的话,判断结果都是true。(查instanceof跟类继承相关的资料)
私有方法外部不能访问是指你不能这么访问:son.hello();
对于楼主的疑问好像更偏重于是,为什么能借助sayHello这个方法来访问到Father类中的私有hello方法。关键点在于这个this代表着什么,像上面所说的,跟instnaceof判断出来的结果没关系。要看编译器在这里把this当成什么。
我对于这个this的理解是这样:直属于哪个类,this就代表这个类的实例。
也就是说,sayHello中的this,其实是假借Father之手去调用了hello方法,所以当然可以访问。扩展:
你可以试试在一个按钮点击事件里面去使用this,这个时候this只能访问到OnClickListener中的方法跟属性,而不能访问注册按钮事件的类的方法跟属性,这时候的this即代表OnClickListener的实例,道理是一样的。