Java:如何在main方法中为父类的实例变量赋值?
解决Java子类访问父类同名成员变量的问题
问题分析
你代码里的核心问题有两个:
- 语法错误:Java不允许在类外部(比如
main方法)通过对象.super.成员的方式直接访问父类成员,这不符合语法规范。 - 访问权限限制:父类
Person的course变量是默认的包私有访问权限,如果main方法所在类和Person、Teacher不在同一个包下,也会导致无法访问。
可行解决方案
方案1:在子类中提供方法设置父类成员
这是最符合封装原则的做法,通过子类的方法间接操作父类的course变量:
class Person { String course; // 默认包私有 } class Teacher extends Person { String course; // 子类同名变量,隐藏父类成员 void display() { System.out.print(super.course); } // 新增方法,用于设置父类的course void setParentCourse(String course) { super.course = course; } } public class Main { public static void main(String[] args) { Teacher t1 = new Teacher(); t1.setParentCourse("ENG101"); t1.display(); // 输出 ENG101 } }
方案2:修改父类成员的访问权限为protected
将父类Person的course改为protected权限,这样子类可以直接访问,同时同包下的类也能访问(不过依然推荐用方法封装):
class Person { protected String course; // 受保护权限,子类可直接访问 } class Teacher extends Person { String course; void display() { System.out.print(super.course); } } public class Main { public static void main(String[] args) { Teacher t1 = new Teacher(); t1.setParentCourse("ENG101"); t1.display(); } }
方案3:移除子类的同名变量(推荐)
如果子类不需要自己的course变量,直接删除子类中的String course;声明,此时子类访问course就是父类的成员,无需用super:
class Person { String course; } class Teacher extends Person { void display() { System.out.print(course); // 直接访问父类的course } } public class Main { public static void main(String[] args) { Teacher t1 = new Teacher(); t1.course = "ENG101"; // 直接赋值父类的course t1.display(); // 输出 ENG101 } }
关键说明
super关键字只能在子类的非静态方法内部使用,用来区分父类和子类的同名成员,不能在类外部通过对象调用。- 尽量避免在子类中定义与父类同名的成员变量,这会导致成员隐藏,增加代码复杂度。
内容的提问来源于stack exchange,提问作者Faiaz07
相关产品推荐
相关产品推荐

