[Java]java子类中如何访问和修改父类成员

本文探讨了在面向对象编程中,子类如何访问父类的不同访问权限的成员变量,包括private、public、protected及默认权限,并提供了具体的代码示例。

 

 
根据父类成员的 访问权限修饰词分为两种情况:

①父类成员域由private修饰,那么在子类中不能直接访问父类成员域,但是可以通过父类中的公共方法访问以及修改父类成员域。如:

class FatherClass{

      private int a;

      public int geta(){ return a;}

      public void seta(int a){this.a=a;}

}

则在子类中可以通过geta获得父类的成员域的值,通过seta修改父类成员域的值

②父类成员由public或protected或default(不写访问权限修饰词),在子类中可以直接访问父类成员域,可以修改继承的父类成员域,但是不能直接修改父类本身的成员域(可以通过上面所说的public void seta(int a){this.a=a;}对父类本身的成员域进行修改),以下是示例代码:

运行结果:

 

父类本身的a与子类从父类继承的a占据两个不同的独立的存储空间,在继承之后,他们的值互不相干(继承的时候进行值传递),这样可以避免因为子类中的操作而导致对父类的a的值进行预期结果之外的修改

Java 中,子类不能直接访问父类的私有成员变量,但可以通过以下方法实现对父类私有成员变量的访问: ### 1. 使用父类提供的公共访问方法 如果父类提供了私有成员变量的公共访问方法(如 getter setter 方法),子类可以通过调用这些方法来间接访问修改父类的私有成员变量。 示例代码如下: ```java // 父类 class Parent { private String privateName; public Parent(String privateName) { this.privateName = privateName; } // 提供公共的 getter 方法 public String getPrivateName() { return privateName; } // 提供公共的 setter 方法 public void setPrivateName(String privateName) { this.privateName = privateName; } } // 子类 class Child extends Parent { public Child(String privateName) { super(privateName); } public void printParentPrivateName() { // 通过调用父类的 getter 方法访问私有成员变量 System.out.println("Parent's private name: " + getPrivateName()); } public void changeParentPrivateName(String newName) { // 通过调用父类的 setter 方法修改私有成员变量 setPrivateName(newName); } } public class Main { public static void main(String[] args) { Child child = new Child("John"); child.printParentPrivateName(); child.changeParentPrivateName("Mike"); child.printParentPrivateName(); } } ``` 在上述代码中,`Parent` 类有一个私有成员变量 `privateName`,并提供了 `getPrivateName()` `setPrivateName()` 方法。`Child` 类继承自 `Parent` 类,通过调用这些公共方法来访问修改父类的私有成员变量 [^1]。 ### 2. 子类方法影响父类私有属性 如果子类中有方法影响到了父类的私有属性,那么私有属性是能够被子类使用的。例如,子类继承父类的方法,在实例化时先对父类进行实例化,通过 `this` 关键字可以访问父类中的成员变量 [^2]。 ### 3. 反射机制 反射机制可以在运行时访问修改对象的私有成员变量,但这种方法不推荐在常规开发中使用,因为它破坏了类的封装性。 示例代码如下: ```java import java.lang.reflect.Field; // 父类 class ParentClass { private String privateField = "Private Value"; } // 子类 class ChildClass extends ParentClass { public void accessParentPrivateField() throws NoSuchFieldException, IllegalAccessException { // 获取父类的 Class 对象 Class<?> parentClass = getClass().getSuperclass(); // 获取父类的私有成员变量 Field privateField = parentClass.getDeclaredField("privateField"); // 设置可访问 privateField.setAccessible(true); // 获取私有成员变量的值 String value = (String) privateField.get(this); System.out.println("Parent's private field value: " + value); } } public class ReflectionExample { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { ChildClass child = new ChildClass(); child.accessParentPrivateField(); } } ``` 在上述代码中,`ChildClass` 通过反射机制访问父类 `ParentClass` 的私有成员变量 `privateField`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值