2 czkerl czKerl_ 于 2016.04.14 16:03 提问

Java一个很基础的面试题【求助】
 public class Apple extends Fruit  {
    private String name = "apple";
    public Apple () {
        tellName();
        printName();
    }
    public void tellName() {
        System.out.println("Apple tell name: " + name);
    }
    public void printName() {
        System.out.println("Apple print name: " + name);
    }
    public static void main(String[] args){
        new Apple();    
    }
}
class Fruit {
    private String name = "fruit";
    public Fruit () {
        tellName();
        printName();
    }
    public void tellName() {
        System.out.println("fruit tell name: " + name);
    }
    public void printName() {
        System.out.println("fruit print name: " + name);
    }
}

我想知道为什么会输出4行
以及什么原因
感谢各位

13个回答

chenhchen1994
chenhchen1994   2016.04.14 16:19
已采纳

1.先走第三行代码进tellName()方法。打印输出 Apple tell name: null
2.进入Class Fruit 进入public Fruit()方法中的tellName
3.再走第三行代码进printName()方法。打印输出 Apple print name: null
4.进入Class Fruit 进入public Fruit()方法中的printName
5.走第二行代码 给name赋值apple
6.重复走1-打印输出 Apple tell name: apple -2-3 -打印输出 Apple print name:apple

chenhchen1994
chenhchen1994 回复June君: 因为第一次走的时候,没有给name赋值,所以是null啊
2 年多之前 回复
czKerl_
czKerl_ 回复June君: 父类的name是私有的
2 年多之前 回复
qq_32224861
qq_32224861 为什么会是null呢?
2 年多之前 回复
u010368406
u010368406   2016.04.14 16:16

创建子类实体时,在执行构造方法时会先执行父类的构造方法,所以会先输出父类的两行,在输入子类的两行

maowei117
maowei117   2016.04.15 13:44

这个问题在Thinking in java中有比较好的一个解释,我们要知道在new子类对象的过程中发生了些什么:
1、在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零,也就是说,我现在要new Apple对象了,我先要分配好内存,而且内存全部初始化为0
2、调用基类构造器。子类构造器在调用的时候必须调用基类的构造器(有可能你没写,也成功了,那是因为java默认帮你调用了,但是最好还是自己显式写出来)
重点就在于第二步:在这个例子里面,Fruit的构造器调用了tellName(),printName().而子类又重写了这两个方法,所以在这里就已经存在了多态。因为在加载类的
时候发现我的子类已经重写了这两个方法,所以基类中的tellName(),printName()实际上是子类重写之后的方法。所以执行代码你会发现,前两行输出的是
Apple tell name: null
Apple print name: null
说明这个方法是子类的方法,而不是基类的
至于为什么是null:因为这里的name指向的是子类的私有成员name,而这个时候子类的私有成员还没有被初始化,只有父类的私有成员name被初始化了
所以这里当然显示null
3、按照声明的顺序调用成员的初始化方法。执行完父类的构造方法,才会转到子类对子类的name进行初始化,这也解释了null的问题。
4、调用子类的构造方法。这个时候再调用子类的构造方法,这时候因为name已经初始化了name="Apple"。所以这时候显示的就是
Apple tell name: apple
Apple print name: apple

总结:这个问题的关键就是,如果基类的构造器调用了基类的方法,而恰好这个方法又被子类重写了,那么实际上基类构造器在执行的时候
是执行的子类重写后的方法。
因为这样的特性,有时会导致很多问题,所以建议构造方法里面的内容要尽可能简单,构造器里面唯一能安全调用的方法是基类中的final方法,
因为它们不会被重写。

czKerl_
czKerl_ 十分感谢,看了收获很大
2 年多之前 回复
qq_26971803
qq_26971803   2016.04.14 16:11

我觉得在继承的时候就默认调用了父类的构造方法。所以会多出两行。这就好比你继承Jbutton。就算你啥都不写调用之后还是会显示一个button。个人理解。错了勿喷

CSDNXIAOD
CSDNXIAOD   2016.04.14 16:12

JAVA 面试题<基础>
面试题之java基础
常见JAVA基础面试题有哪些
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

JTPower
JTPower   2016.04.14 16:16

应该是调用了父类的构造方法,你可以把父类的构造方法里面的方法注释掉一个看下效果

stargazer1989
stargazer1989   2016.04.14 16:41

实例化子类对象时,父类对象也会相应的被实例化,也就是说实例化子类对象时,Java编译器会在子类的构造方法中调用父类的的**无参构造函数**。

li301928
li301928   2016.04.14 17:42

继承并不继承构造,其他构造方法什么的都继承,而父类的两个方法在子类中重写。所以实际上就只有子类的两个方法。
注释掉父类构造里面的方法就出现只有两个结果的情况,可以说明执行父类构造的时候调用了子类的方法,但是并没法传递name值,所以为空。
大家可以试试把父类中的两个狗杂哦方法改为private类型,这样不满足继承中重写条件,那么执行父类构造时只会调用父类方法值不为空。吓试的不一定正确,求改

u012768347
u012768347   2016.04.14 17:43

http://blog.csdn.net/u012768347/article/details/51009724

当创建一个子类实例时,在对象初始化过程中会依据继承体系向上初始化父类。

其实在子类构造器其中,有一个隐式语句是Java虚拟机自动加上的,比如在Apple类默认构造函数的第一句,有super();
这样会先初始化Fruit类,所以有输出

  • fruit tell name: fruit
  • fruit print name:fruit
  • Apple tell name: apple
  • Apple print name:apple
  • 可以参考

内存中对象实例化细节

u012768347
u012768347 回复li301928: 实际上时子类空间的tellName(),此时子类name是String类型,系统初始化是null 然后2.同样调用printName(),此时name还是null,输出Apple print name: null,然后3.父类初始化完毕,此时才到子类显示初始化,name被赋值apple,此时调用的两个方法就是子类方法,输出Apple tell name: apple Apple print name:apple
2 年多之前 回复
u012768347
u012768347 回复li301928: 是我弄错了,子类覆盖了父类方法,所以1.虽然先初始化父类,但是在父类里的tellName()调用的
2 年多之前 回复
u012768347
u012768347 回复li301928: 是我弄错了,子类覆盖了父类方法,所以1.虽然先初始化父类,但是在父类里的tellName()调用的
2 年多之前 回复
li301928
li301928 你的输出结果不对Apple tell name: null Apple print name: null Apple tell name: apple Apple print name: apple
2 年多之前 回复
qq_34108945
qq_34108945   2016.04.14 22:42

java新手,亲手试验补充,实践证明父类的name属性即使是public结果一样;顺序如数字所标从大到小,若父类中的name属性为private则跳过4
public class Apple extends Fruit {
private String name = "apple";//9
public Apple () {//2
tellName();//10
printName();//12
}
public void tellName() {//6 //11
System.out.println("Apple tell name: " + name);
}
public void printName() {//8 //13
System.out.println("Apple print name: " + name);
}
public static void main(String[] args){
new Apple(); //1
}
}
class Fruit {
public String name = "fruit";//4
public Fruit () {//3
tellName();//5
printName();//7
}
public void tellName() {
System.out.println("fruit tell name: " + name);
}
public void printName() {
System.out.println("fruit print name: " + name);
}
}

共13条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
中高级 java面试题总览
JAVA 基础1. JAVA 中的几种基本数据类型是什么,各自占用多少字节。 数据类型关键字内置类内存占用字节数布尔型booleanBoolean1字节字符型charCharacter2字节字节型byteByte1字节短整型shortShort2字节整形intInteger4字节长整型longLong8字节单精度型floatFloat4字节双精度型doubleDouble8 2. String 类...
java基础知识(常用的简单面试题)
本文为笔者学习过程中根据老师指导自行整理! 1、JDK、JRE、JVM ①  JDK: Java Development kit   Java 开发工具包 ②  JRE: Java Runtime Environment  Java 运行环境 ③  JVM: Java virtual Machine  Java 虚拟机 2、简述Java程序编译和运行的过程 ①  Java编译程序将
C/C++基础面试-Sizof的全面理解
C/C++基础面试-Sizof的全面理解
JAVA面试题——初级
1、关于常用包 java.long 基础包:String Math Integer... java.util 工具包:Collection Map Date java.sql 数据库相关:Conection java.io 输入输出:OutputStream File 2、JDK、JRE、JVMA的区别 JDK:是java开发的工具箱,包含jre,还包含将java文件编译为class文
2018 java面试题基础
4、&amp;amp;和&amp;amp;&amp;amp;的区别答: &amp;amp;是位运算符,表示按位与运算,&amp;amp;&amp;amp;是逻辑运算符,表示逻辑与(and)5、Collection 和 Collections的区别答: Collection是集合类的上级接口,继承与他的接口主要有Set 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作11...
JAVA基础面试题(经典)
JAVA基础面试题(经典)
2018java基础面试题(我自己用的,面试好多家公司基本会问到的问题和技术)
1,webservice是什么?webservice是一种跨编程语言和跨操作系统的远程调用技术,遵循SOPA/WSDL规范。2,springCloud是什么?springcloud是一个微服务框架,并提供全套分布式系统解决方案。支持配置管理,熔断机制,leader选举,服务治理,分布式session,微代理,控制总线,智能路由,一次性token。Java中堆和栈有什么不同?每个线程都有自己的栈内存...
2017Java基础面试题
1.Java语言的特点 跨平台:windows,linux,mac,因为其有JVM,虚拟内存机。 半编译半解释:用记事本写Java代码,然后将其转化为.class文件。 2.八大基本数据类型 byte,short,int,long,float,double,char,boolean 3.instanceof是什么,作用是什么? instanceof是比较运算符,判断某个对象是否属于某个
JAVA基础知识面试题
转载 题目是转载的,后面陆续把个人答案补充上,权当知识总结 基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 pos...
[笔试面试]计算机专业校招笔试面试基础知识总结
这里总结了校招笔试面试过程中常见的基础问题,包括数据结构,计算机网络,操作系统,数据库的知识。