访问继承的类成员时出错
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
【讨论】:
以上是关于访问继承的类成员时出错的主要内容,如果未能解决你的问题,请参考以下文章