打印结果如图,感觉有点矛盾,打印this的结果说明this引用的是sub对象,可是前面两个结果都是
Base,更无法理解的是,super.toString()打印的也是sub对象的引用,求大神指点 ,这是怎么回事
Base,更无法理解的是,super.toString()打印的也是sub对象的引用,求大神指点 ,这是怎么回事
解决方案 »
- 设计一个类时,我觉得一个*.java文件里边,没有必要设计在多个类。我都设计成本类里的方法。
- jsp编译错误,麻烦各位看看。(简单)
- 请问JAVA是解释执行的吗?所谓解释执行是什么?JSP的解释执行和JAVA一样的道理吗?什么是运行期?
- 写一java 程序,在运行时,让所有的键盘控制键(诸如,Ctrl,Alt 等)输入无效,用户只能输字母与数字,How to ?
- 如何把zip文件中的文件解压出来呀?
- 居然没有人问这个问题!!!
- 有问题请教大神了
- 请教一下各位大侠,java1.1.4上哪下载
- 企业级的java应用是什麽概念?包含那些方面?
- Java新手请教个关于instanceof的问题
- java GUI窗口连续关闭问题
- 菜鸟JAVA大神
实际类型是sub,声明类型是Base啊
您好,首先谢谢您的解答,不过我还是有点不太明白,您说的在父类中this的声明类型是Base,这个怎么理解?
意思是当一个引用调用从父类继承而来的方法时,首先是将引用临时转为父类类型?是这个意思吗?还有下面是我自己的思考,还请您指正:
1.this.showMe()打印结果是:Base,如果this的运行时类型是Sub的话,根据动态绑定机制,实例方法与引用变量实际引用的对象的方法绑定,那它打印结果应该是Sub吧?当然,我知道,如果将Base类的的showMe方法改为public,则打印的是Sub,意思是,动态绑定机制只适用于重写的情况?
2.this.a 打印结果是Base,您说是因为this引用类型是Base,如果您能具体讲一下(即回答一下我上面的问题),我应该会明白,这是因为静态绑定。
3.this 打印结果是jicheng.Sub@6521f956,因为toString方法调用getClass.getName()+@,打印的是对象所属类的名称,this引用Sub对象,这个我可以理解。
4.super.toString 打印结果是jicheng.Sub@6521f956,super代表当前对象的父类对象的引用,那我调用super.toString方法,
当前对象是Sub对象,则父类对象即super引用的是Base对象,执行后打印的应该是jicheg.Base@才对吧?
写的有点多,耽误了您的时间,十分感谢!
private String name="sub";
public sub(String name) {
super(name);
this.name=name;
}
public String showMe(){
return "sub";
}
public static void main(String[] args) {
sub s=new sub("sub");
s.print();
}
}
class base {
private String name="sub";
public base(String name) {
this.name=name;
}
public String showMe(){
return "base";
}
public void print(){
System.out.println(showMe()+" "+this.name+" "+this.toString());
}
}
之后的是因为没有子类没有创建构造函数,所以a没有被初始化;
导致了调用的就是引用了子类的a参数
2. Java中是没有变量override的说法的,访问的变量优先访问类自身的变量,其次是父类中的变量。也可以说编译阶段就已经明确了。
3. this就是指当前实际对象本身,无论他出现在哪里。打印this相当于执行this.toString()
4. super.toString()等同于执行this.toString()你可以 加上以下代码进一步理解:
Base base1 = new Base();
base1.print();
Base base2 = new Sub();
base2.print();