public class Basics {
Basics b = new Basics();
int instanceVariable = 0;
public void behavior() {
System.out.println("Print Something");
}
b.behavior(); // Why this line, b.behavior doesn't work?
public static void main(String[] args){
Basics b = new Basics(); /* Why are we allowed to create an
* object of same name again within
* the same class */
b.behavior(); // This line works
}
}
在上面的课程中,我可以创建对象。但是我不能在任何课程之外调用b.behavior
,但我能够在一个方法中做到这一点。为什么会这样?有什么区别?
public class Basics1 extends Basics{
Basics b = new Basics();
Basics1 b1 = new Basics1();
b = b1.instanceVariable; // I don't see error in this line, but previous line shows //error.
b1.instanceVariable // This line doesn't work
}
为什么b1.instanceVariable
不起作用,instanceVariable
是基类实例变量。
答案 0 :(得分:3)
类定义变量和方法。 b.behavior(); 是一个不能单独发表的声明。
答案 1 :(得分:3)
您需要了解类是"类型定义",而不是代码块或语句序列。
您不能只在类型定义中编写任意语句。
即使如此,"b1.instanceVariable"
也不是声明。 "b1.instanceVariable"
在语句环境中没有任何意义。
答案 2 :(得分:2)
所有代码都需要在方法,字段声明(例如示例中的Basics b = new Basics();
)或“初始化程序块”(作为构造函数的一部分或在类初始化期间运行)中。
这只是一种语法规则。
在其他语言中,您可以拥有这种“原始代码”,以实现各种效果。你想要达到什么目标?
答案 3 :(得分:0)
在任何地方编写代码并期望它执行是程序编程的一种形式。在这种形式下,你倾向于松散上下文,很快代码变成了意大利面条代码 - >随时随地调用的方法。
使用OOP,您可以使用定义良好的方法创建具有已定义上下文的对象。试想一下,你想什么时候得到b.behavior();被调用:在初始化类之前,在初始化类之后,执行main之后或者当对象被销毁时?
有趣的是,Java为每个状态定义了语法。您可以将代码包装在{System.out.println(“Hello World”)中;它将在类实例化时执行...也可以使用static {System.out.println(“Hello World”);这将在加载类时执行。但同样,这是告诉JVM何时这样做的一部分 - 一个商定的语法..但是如果你的代码没有任何标记,你什么时候才能真正运行?