为什么我们不能使用方法外的类对象来调用类的方法?

时间:2014-05-23 03:03:08

标签: java oop

    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是基类实例变量。

4 个答案:

答案 0 :(得分:3)

类定义变量和方法。 b.behavior(); 是一个不能单独发表的声明。

答案 1 :(得分:3)

您需要了解类是"类型定义",而不是代码块或语句序列。

您不能只在类型定义中编写任意语句。

即使如此,"b1.instanceVariable"也不是声明。 "b1.instanceVariable"在语句环境中没有任何意义。

答案 2 :(得分:2)

所有代码都需要在方法,字段声明(例如示例中的Basics b = new Basics();)或“初始化程序块”(作为构造函数的一部分或在类初始化期间运行)中。

这只是一种语法规则。

在其他语言中,您可以拥有这种“原始代码”,以实现各种效果。你想要达到什么目标?

  • 在编译期间运行(如在Perl中):无法在Java中完成
  • 在构造函数中运行:使用init块
  • 在类加载期间运行:使用静态init块
  • 在程序启动时运行:将其放在static void main
  • 在方法调用期间运行:将其放在该方法中

答案 3 :(得分:0)

在任何地方编写代码并期望它执行是程序编程的一种形式。在这种形式下,你倾向于松散上下文,很快代码变成了意大利面条代码 - >随时随地调用的方法。

使用OOP,您可以使用定义良好的方法创建具有已定义上下文的对象。试想一下,你想什么时候得到b.behavior();被调用:在初始化类之前,在初始化类之后,执行main之后或者当对象被销毁时?

有趣的是,Java为每个状态定义了语法。您可以将代码包装在{System.out.println(“Hello World”)中;它将在类实例化时执行...也可以使用static {System.out.println(“Hello World”);这将在加载类时执行。但同样,这是告诉JVM何时这样做的一部分 - 一个商定的语法..但是如果你的代码没有任何标记,你什么时候才能真正运行?