访问继承的类成员时出错

Posted

技术标签:

【中文标题】访问继承的类成员时出错【英文标题】:Getting error in accessing inherited class member 【发布时间】:2019-12-19 17:05:27 【问题描述】:

我是java初学者。我想使用基类和派生类的对象访问基类中的扩展(继承类的数据成员。但我面临这个错误: 令牌“奖金”上的语法错误,在尝试使用基类和派生类的对象访问成员奖金时,此令牌后应有 VariableDeclaratorId

如果我将对象创建和访问的代码放在 public static void main 方法中,这个错误就会消失。我想了解其中的原因?

public class DerivedClass
    public int bonus = 100;
    public static void main(String[] args) 
    // TODO Auto-generated method stub

    


class BaseClass extends DerivedClass 

    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    b.bonus = 200; //error here
    d.bonus = 400; //error here
    System.out.println("bonus this year is:"+" "+ s.bonus);

错误信息:

令牌“bonus”的语法错误,VariableDeclaratorId 预计在之后 这个令牌

【问题讨论】:

您只是将代码直接放入类中,而不是在构造函数或方法中。 请注意,为避免混淆,您应该相应地命名您的类。基类 - 是可扩展类,派生类 - 是扩展类。 【参考方案1】:

将它包装在一个方法中,您将看到两者都有效。不允许您直接在类主体中编写代码块。

class BaseClass extends DerivedClass     
    public static void main(String[] args) 
        BaseClass b = new BaseClass();
        DerivedClass d = new DerivedClass();
        b.bonus = 200;
        d.bonus = 400;
    

有initialisers,尽管它们也必须在 中声明。


    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    b.bonus = 200;
    d.bonus = 400;

类主体具有定义良好的结构(字段声明、方法声明、块声明)。您只需遵循该结构即可。

8.1.6. Class Body and Member Declarations

类主体可能包含类成员的声明,即字段(第 8.3 节)、方法(第 8.4 节)、类(第 8.5 节)和接口(第 8.5 节)。

类主体还可以包含实例初始化程序(第 8.6 节)、静态初始化程序(第 8.7 节)和类的构造函数声明(第 8.8 节)。

ClassBody:
   ClassBodyDeclaration 

ClassBodyDeclaration:
  ClassMemberDeclaration 
  InstanceInitializer 
  StaticInitializer 
  ConstructorDeclaration

ClassMemberDeclaration:
  FieldDeclaration 
  MethodDeclaration 
  ClassDeclaration 
  InterfaceDeclaration 
  ;

【讨论】:

我已经提到过。我知道它会在 main 方法中工作。但我想知道为什么它不能这样工作.. @user2156513:因为您不能将语句直接放入类声明中 - 只有声明。这与继承或变量无关 - 您会看到与 class Test System.out.println("This won't work."); 相同的问题【参考方案2】:

你不能直接在类体中写语句。您需要将它们放在一个方法中。

Statements are not allowed 表示不允许以下任何一项:

Assignment expressions (aValue = 23.45;) Any use of ++ or -- (aValue++;) Method invocations (System.out.println("Hello World!");) Object creation expressions (Car mycar = new Car();)

【讨论】:

【参考方案3】: 您应该阅读“Head First Java”一书。 在您的代码中,您试图更改对象的状态,这就是您收到错误的原因。您可以在方法或块中执行此类操作。 DerivedClass 应该调用 BaseClass,BaseClass 应该调用 DerivedClass(这基于 extends 关键字。) 糟糕的代码(具有主方法的超类。);我刚刚删除了编译错误,请参见下面的代码。

希望对你有所帮助。

public class DerivedClass 
    public int bonus = 100;
    public static void main(String[] args) 
    // TODO Auto-generated method stub

    



class BaseClass extends DerivedClass 
    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    // code in block
    
        b.bonus = 200; // no here
        d.bonus = 400; // no here
        System.out.println("bonus this year is:" + " " + d.bonus); // fixed typo
    

【讨论】:

以上是关于访问继承的类成员时出错的主要内容,如果未能解决你的问题,请参考以下文章

Java---继承

向上转换到基类时如何使用继承的类成员的值

Lua实现简单的类,继承,多态 实例

对象的继承访问控制

C ++继承类具有同名成员

java中的类修饰符成员变量修饰符方法修饰符。