Java中父类对象设置父类成员变量,子类使用为啥为null?
时间: 2024-06-06 07:09:29 浏览: 153
在Java中,父类的成员变量默认是不能被子类继承的,只有通过在父类中使用protected关键字来修饰成员变量才能被子类继承。如果父类成员变量是私有的,则子类无法访问它。如果父类成员变量是public或protected,那么子类可以直接访问它,但是如果在父类中将该成员变量设为null,那么在子类中访问父类的该成员变量时会返回null。这是因为在Java中,子类不会继承父类的成员变量,而是会创建一个独立的成员变量。子类可以访问父类的成员变量,但无法对其进行修改。
相关问题
java(1)为每个类重写 toString 和 equals 方法(2)在父类中定义一个不可重写的方法(3)在主类中定义一个能实现多态的方法 (提示:方法的形参为一个父类引用变量,调用时传入一个子类对象实例) (4)编写主类验证上述要求
非常好的问题!我会根据你的要求回答。
1. 为每个类重写toString和equals方法
为了重写toString和equals方法,我们可以在每个类中添加以下代码:
```java
// 重写toString方法
@Override
public String toString() {
return "这是一个" + getClass().getName() + "对象";
}
// 重写equals方法
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
return true;
}
```
这样,每个类都有了自己的toString和equals方法。
2. 在父类中定义一个不可重写的方法
为了定义一个不可重写的方法,我们可以使用Java中final关键字。在父类中添加以下代码:
```java
public final void finalMethod() {
System.out.println("这是一个不可重写的方法");
}
```
这样,我们就可以在子类中使用这个方法,但不能重写它。
3. 在主类中定义一个能实现多态的方法
为了定义一个能实现多态的方法,我们可以在主类中添加以下代码:
```java
public void polymorphismMethod(ParentClass obj) {
obj.parentMethod();
}
```
这个方法接受一个ParentClass类型的参数,在方法体中调用该参数对象的parentMethod方法。由于ParentClass是一个抽象类,因此我们可以传递任何继承自ParentClass的子类对象,从而实现多态。
4. 编写主类验证上述要求
为了验证上述要求,我们可以编写以下代码:
```java
public class MainClass {
public static void main(String[] args) {
// 创建子类对象
ChildClass child = new ChildClass();
// 调用toString方法
System.out.println(child.toString());
// 调用equals方法
ChildClass child2 = new ChildClass();
System.out.println(child.equals(child2));
// 调用finalMethod方法
child.finalMethod();
// 调用polymorphismMethod方法
ParentClass parent = new ParentClass();
ChildClass child3 = new ChildClass();
polymorphismMethod(parent); // 输出:这是ParentClass类的parentMethod方法
polymorphismMethod(child3); // 输出:这是ChildClass类的parentMethod方法
}
}
// 父类
abstract class ParentClass {
public abstract void parentMethod();
public final void finalMethod() {
System.out.println("这是一个不可重写的方法");
}
}
// 子类
class ChildClass extends ParentClass {
@Override
public void parentMethod() {
System.out.println("这是ChildClass类的parentMethod方法");
}
}
```
这个代码演示了我们上述要求的实现。
如何实现父类成员变量的初始化
在Java等面向对象语言中,如果你想要在子类中初始化父类的成员变量,有两种常见的做法:
1. **默认初始化**:如果父类的某个成员变量没有显式地提供初始值,在创建子类对象时,如果没有特别指定,系统将默认给该变量赋予它们的数据类型所对应的默认值。例如,对于基本类型如int,就是0;对于引用类型通常是null。
2. **构造函数初始化**:你可以直接在子类的构造函数中调用父类的构造函数,并传入所需的参数来初始化父类的成员变量。例如:
```java
class Parent {
private String value;
public Parent(String initialValue) {
this.value = initialValue;
}
}
class Child extends Parent {
// 在Child的构造函数中初始化父类的value
public Child(String childValue, String parentValue) {
super(parentValue); // 调用父类的构造函数
this.childValue = childValue; // 初始化子类的成员变量
}
}
```
在这个例子中,`super(parentValue)`负责对`Parent`的`value`进行初始化。
**相关问题--:**
1. 如果父类的成员变量是final类型的,还能在子类构造函数中初始化吗?
2. 构造函数链是如何工作的?
3. 是否可以在子类中重写父类的构造函数来更好地初始化父类变量?
阅读全文