You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:如何在main方法中为父类的实例变量赋值?

解决Java子类访问父类同名成员变量的问题

问题分析

你代码里的核心问题有两个:

  1. 语法错误:Java不允许在类外部(比如main方法)通过对象.super.成员的方式直接访问父类成员,这不符合语法规范。
  2. 访问权限限制:父类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:55:16