Java继承中的几道面试题

第一题:

 1 /*
 2     看程序写结果:
 3         A:访问成员变量的原则:就近原则。
 4         B:this和super的问题:
 5             this    访问本类的成员
 6             super    访问父类的成员(可以理解为的)
 7         C:子类的所有构造方法执行前默认先执行父类的无参构造方法。
 8         D:一个类的初始化过程:
 9             成员变量进行初始化过程如下:
10                 默认初始化
11                 显示初始化
12                 构造方法初始化
13
14     输出的结果是:
15             fu
16             zi
17             30
18             20
19             10
20 */
21 class Fu {
22     public int num = 10;
23     public Fu() {
24         System.out.println("fu");
25     }
26 }
27
28 class Zi extends Fu {
29     public int num = 20;
30     public Zi() {
31         System.out.println("zi");
32     }
33     public void show() {
34         int num = 30;
35         System.out.println(num); //30
36         System.out.println(this.num); //20
37         System.out.println(super.num); //10
38     }
39 }
40 class ExtendsTest {
41     public static void main(String[] args) {
42         Zi z = new Zi();
43         z.show();
44     }
45 }

第二题:

 1 /*
 2     看程序写结果:
 3         A:一个类的静态代码块,构造代码块,构造方法的执行流程:
 4             静态代码块 > 构造代码块 > 构造方法
 5         B:静态的内容是随着类的加载而加载,
 6             即:静态代码块的内容会优先执行。
 7         C:构造代码块
 8              在类中方法外出现(即在类中的成员位置),可以把多个构造方法方法中相同的代码存放到一起,用于对对象进行初始化,
 9             每次调用构造方法都执行,并且在构造方法前执行。
10         C:子类的所有的构造方法默认都会去访问父类的无参构造方法。
11
12     输出结果是:
13           静态代码块Fu
14           静态代码块Zi
15           构造代码块Fu
16           构造方法Fu
17           构造代码块Zi
18           构造方法Zi
19 */
20 class Fu {
21     static {
22         System.out.println("静态代码块Fu");
23     }
24
25     {
26         System.out.println("构造代码块Fu");
27     }
28
29     public Fu() {
30         System.out.println("构造方法Fu");
31     }
32 }
33
34 class Zi extends Fu {
35     static {
36         System.out.println("静态代码块Zi");
37     }
38
39     {
40         System.out.println("构造代码块Zi");
41     }
42
43     public Zi() {
44         System.out.println("构造方法Zi");
45     }
46 }
47
48 class ExtendsTest2 {
49     public static void main(String[] args) {
50         Zi z = new Zi();
51     }
52 }

第三题:

 1 /*
 2     看程序写结果:
 3         A:成员变量的问题
 4             int x = 10; //成员变量x是基本类型
 5             Student s = new Student(); //成员变量s是引用类型
 6         B:一个类的初始化过程
 7             先进行成员变量的初始化:
 8                 默认初始化
 9                 显示初始化
10                 构造方法初始化
11         C:子父类的初始化(分层初始化)
12             先进行父类初始化,然后进行子类初始化。
13
14     结果:
15         YXYZ
16
17     问题:
18         虽然子类中的构造方法默认有一个 super();
19         但初始化的时候,不是按照那个顺序进行的。
20         而是按照分层初始化进行的。
21         super(); 它仅仅表示要先初始化父类数据,再初始化子类数据。
22 */
23
24 class X {
25     //成员变量(引用类型)
26     Y b = new Y();
27     //无参构造方法
28     X() {
29         System.out.print("X");
30     }
31 }
32
33 class Y {
34     //无参构造方法
35     Y() {
36         System.out.print("Y");
37     }
38 }
39
40 public class Z extends X {
41     //成员变量(引用类型)
42     Y y = new Y();
43     //无参构造方法
44     Z() {
45         //super(); //它仅仅表示要先初始化父类数据,再初始化子类数据。
46         System.out.print("Z");
47     }
48     public static void main(String[] args) {
49         new Z();
50     }
51 }

原文地址:https://www.cnblogs.com/chenmingjun/p/8449506.html

时间: 2024-08-30 00:22:38

Java继承中的几道面试题的相关文章

Java 继承中的构造方法

Java 继承中的构造方法 子类可以继承父类的构造方法,并遵循以下原则: 子类构造的构成中必须调用其基类的构造方法.    2.子类可以在自己的构造方法中使用super()调用基类的构造方法. 使用this()调用本类的另外的构造方法. 如果调用super(),必须写在子类构造方法的第一行. 3.如果子类的构造方法中没有显示的调用基类构造方法,则系统默认调用基类无参的构造方法.    4.如果子类的构造方法中既没有显示的调用基类的构造方法,而基类中又没有无参的构造方法,则编译会出错. 1 cla

Java 继承中构造方法的执行顺序问题

在Java中,如果一个类没有任何显式创建的构造器则该类默认会有一个无参构造器:如果显式创建了有参构造器则该类就不再有默认无参构造器. 在Java继承中,构造器并不能被继承,而是被显示或隐式调用. 1.子类的构造方法中必须调用其基类的构造方法(显示或隐式) 1.1.若是显示调用,则可以通过 super(argument_list) 来调用,且super调用必须在首行以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化(this关键字可以调用本类中的其他构造器,也必须在首句,因此thi

【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析

一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 接口定义的一般形式为: [访问控制符]interface <接口名> { 类型标识符final 符号常量名n = 常数: 返回值类型  方法名([参数列表]); … } 二.接口的特点 1.Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显

[Java] 继承中,父类被覆盖的成员变量、方法的可访问性

在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. 例子: Super, 父类,拥有一个成员变量 x ,和成员方法 doSomething(). Point,继承 Super, 但覆盖了 Super 的 x 和 doSomething(),拥有自己的同名成员成员 x 和 doSomething(). StaticDemo1, 演示在继承中,在内部,可

【Java学习笔记之二十】final关键字在Java继承中的用法小结

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类   当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让他被继承,就可以用final

Java继承中的转型及其内存分配

看书的时候被一段代码能凌乱啦,代码是这样的: package 继承; abstract class People { public String tag = "疯狂Java讲义"; //① public String name = "Parent"; String getName(){ return name; } } class Student extends People { //定义一个私有的tag实例变量来隐藏父类的tag实例变量 String tag =

5.Java继承中方法的覆盖和重载

在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public class D

JAVA继承中的构造器调用

关于继承中的构造器调用和调用顺序,做了个小测试,如下: class People {  String name;    //2,第二步,调用此无参构造器  public People() {   System.out.println(".父类的无参构造器");  }    //5,调用此有参构造器  public People(String name) {   System.out.println(".父类的有参构造器");   this.name = name;

JAVA继承中的构造方法

继承中的构造方法: //A 继承于 B //1.在new一个A之前,需要先构造一个B //2.在A的构造方法内中使用"super()"关键字先对B进行构造(需要将super关键字放在构造方法的第一行,因为只有先构造出了B之后才能进行下一步的A的构造) //3.在A构造方法中没有写super关键字的时候,编译器会自动调用父类无参的构造方法(无论父类无参构造方法有没有重写) //4.super()根据传入参数对应父类不同构造方法 //5.super()在多层子类中只是构造向上一层类中的构造