【问题标题】: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 预计在之后 这个令牌

【问题讨论】:

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

标签: java


【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多