这是一个关于Java继承中成员变量和成员方法访问特点的面试题。在Java中,继承是面向对象编程的重要特性之一,它允许一个类(子类)继承另一个类(父类)的属性和方法。
面试题可能会以以下形式出现:
问题:Java中继承中成员变量和成员方法的访问特点是什么?请解释。
回答:
在Java中,继承涉及了子类继承父类的成员变量和成员方法。以下是继承中成员变量和成员方法的访问特点:
-
成员变量(字段)的访问:
- 如果子类中定义了与父类相同名称的成员变量,则子类中的成员变量会覆盖(隐藏)父类中的同名成员变量。
- 子类可以直接访问父类的非私有成员变量,但不能直接访问父类的私有成员变量。
- 如果子类中未定义与父类同名的成员变量,则子类对象访问的成员变量将是父类的成员变量。
-
成员方法的访问:
- 如果子类中定义了与父类相同签名(名称和参数列表)的方法,则子类中的方法会覆盖(重写)父类中的同名方法,这被称为方法重写(override)。
- 子类可以通过super关键字调用父类中的方法,即使子类中存在同名方法。
- 如果子类中未定义与父类同名的方法,则子类对象调用的方法将是父类的方法。
综上所述,Java中的继承允许子类获取父类的成员变量和成员方法,并且可以在子类中重写父类的方法以实现多态性。成员变量和成员方法的访问特点受到访问修饰符的影响,但遵循以上规则。
这样的问题可以让面试者展示对Java面向对象编程特性的理解,包括继承、封装、多态等概念的运用。
以下是一个包含源码的Java面试题示例,涉及继承中成员变量和成员方法的访问特点:
问题:
考虑以下Java代码,请解释输出结果并说明其中涉及的继承中成员变量和成员方法的访问特点。
class Parent {
int x = 10;
void display() {
System.out.println("Parent's display()");
}
}
class Child extends Parent {
int x = 20;
void display() {
System.out.println("Child's display()");
}
void print() {
System.out.println("Child's print()");
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.x);
p.display();
}
}
回答和解释:
这段代码创建了一个父类Parent和一个子类Child,然后在主类Main中实例化了一个Child对象,并通过父类引用指向子类对象。
-
成员变量的访问:
- 在Child类中,有一个与父类同名的成员变量x,分别为20和10。
- 在Java中,成员变量不具有多态性,所以在使用父类引用指向子类对象时,访问的是父类的成员变量,即输出结果为
10
。
-
成员方法的访问:
- 在Child类中,有一个与父类同名的display()方法,并且被重写了。
- Java中成员方法具有多态性,所以通过父类引用指向子类对象调用display()方法时,实际上会调用子类的display()方法,输出结果为
Child's display()
。
因此,程序的输出结果为:
10
Child's display()
这个例子突出了Java中继承中成员变量和成员方法的访问特点,尤其是多态性在方法调用中的应用。以下是另外两道涉及继承中成员变量和成员方法访问特点的Java面试题,包含源码:
问题1:
考虑以下Java代码,请解释输出结果并说明其中涉及的继承中成员变量和成员方法的访问特点。
class Animal {
String name = "Animal";
void makeSound() {
System.out.println("Animal makes sound");
}
}
class Dog extends Animal {
String name = "Dog";
void makeSound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
System.out.println(animal.name);
animal.makeSound();
}
}
回答和解释:
这段代码创建了一个Animal类和一个Dog类,其中Dog类继承自Animal类。
-
成员变量的访问:
- Animal类和Dog类都有一个名为
name
的成员变量,分别赋值为"Animal"和"Dog"。 - 在Java中,成员变量不具有多态性,所以通过父类引用指向子类对象时,访问的是父类的成员变量。因此,输出结果为
Animal
。
- Animal类和Dog类都有一个名为
-
成员方法的访问:
- Dog类重写了Animal类的
makeSound()
方法。 - 由于方法具有多态性,在运行时实际上会调用子类(Dog类)的方法。因此,输出结果为
Dog barks
。
- Dog类重写了Animal类的
因此,程序的输出结果为:
Animal
Dog barks
问题2:
考虑以下Java代码,请解释输出结果并说明其中涉及的继承中成员变量和成员方法的访问特点。
class A {
int x = 10;
void display() {
System.out.println("A's display()");
}
}
class B extends A {
int x = 20;
void display() {
System.out.println("B's display()");
}
void print() {
System.out.println("B's print()");
}
}
public class Main {
public static void main(String[] args) {
A a = new B();
System.out.println(a.x);
a.display();
}
}
回答和解释:
这段代码创建了一个A类和一个B类,其中B类继承自A类。
-
成员变量的访问:
- A类和B类都有一个名为
x
的成员变量,分别赋值为10和20。 - 在Java中,成员变量不具有多态性,因此通过父类引用指向子类对象时,访问的是父类的成员变量。因此,输出结果为
10
。
- A类和B类都有一个名为
-
成员方法的访问:
- B类重写了A类的
display()
方法。 - 由于方法具有多态性,在运行时实际上会调用子类(B类)的方法。因此,输出结果为
B's display()
。
- B类重写了A类的
因此,程序的输出结果为:
10
B's display()
这两道题目都涉及到了Java中继承的特性,通过解释输出结果和分析继承中成员变量和成员方法的访问规则,可以考察面试者对Java面向对象编程的理解水平。