首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实例和静态控制-具有继承和重写/方法隐藏的流

实例和静态控制-具有继承和重写/方法隐藏的流
EN

Stack Overflow用户
提问于 2020-07-01 08:49:09
回答 2查看 502关注 0票数 1

我在玩实例控制流和静态控制流,注意下面的代码

代码语言:javascript
运行
复制
class A {
    {
        m1();
    }
    A(){
        System.out.println("A constructor");
    }
    void m1(){
        System.out.println("A m1");
    }
}
public class Main extends A {
    public static void main(String[] args) throws Exception {
        Main m = new Main();
    }
    void m1(){
        System.out.println("Main m1");
    }
}

代码的输出是:

主m1

构造者

我知道这是因为:

首先,静态块和变量是从上到下父到子的标识,在这种情况下,只有一个静态的main()

其次,静态块和变量赋值被执行,所以main()的执行就开始了,并且尝试创建一个新的Main对象。

因此,第三,将识别父类的实例块和变量。然后他们将被执行自上而下。(在此之后,父类的构造函数将运行,然后将标识子类的实例块和变量,然后执行自上而下的,最后执行子类的构造函数)。

所以A中的实例块调用m1()。然后,A的构造函数执行。最后,将控制流返回到main()并终止程序。

现在,A对m1()的调用调用了m1() of Main。但是,如果我使两个m1()方法都是静态的,其他一切都保持不变,那么从A的实例块调用m1()就会调用A的m1()

我有两个问题(为什么?纯粹出于学术原因,我仍在学习Java):

  1. 当两个m1()方法都是非静态的时,可以从A的实例块调用A的m1()吗?我尝试做一个this.m1(),但它仍然调用Main的m1()。(为什么?)

  1. 当两个m1()方法都是静态的时,是否可以从A的实例块调用Main的m1()?(我猜不是,但我不确定)。

我知道在第一种情况下,它正在发生,而在第二种情况下,它是方法隐藏。但我仍然不知道如何根据这些知识回答我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-03 10:47:54

编译完成java 8编译器后,代码如下所示:

代码语言:javascript
运行
复制
 class A {
           A() {
              this.m1();  // at runtime this refers to Main class instance
              System.out.println("A constructor");
           }
        
           void m1() {
              System.out.println("A m1");
           }
        }

public class Main extends A {
     public Main() { }

     public static void main(String[] args) throws Exception {
          Main m = new Main();
          m.m1();
       }
    
       void m1() {
          System.out.println("Main m1");
       }
    }

现在回答你的第一个问题:不。除非您正在创建A的实例(A的实际对象),否则不能。

关于第二个问题:在使m1和m1的静态编译看起来如下:

代码语言:javascript
运行
复制
class A {
   A() {
      m1(); // resolves to A's m1
      System.out.println("A constructor");
   }

   static void m1() {
      System.out.println("A m1");
   }
}
public class Main extends A {
   public Main() {
   }

   public static void main(String[] args) throws Exception {
      new Main();
   }

   static void m1() {
      System.out.println("Main m1");
   }
}

现在,无论您创建哪个实例(A或Main),您都会看到A的m1被执行。

票数 1
EN

Stack Overflow用户

发布于 2020-07-01 09:18:41

1.(当两个方法是实例方法时)如果您在A(父)类中,如果您调用m1();或者this.m1();,您将调用m1()方法的A版本,但是如果您在主类(子)中,如果您调用了m1();,则将调用m1的主版本,尽管如果调用super.m1();,您将调用m1方法的A版本。

2.(如果方法是静态的)可以在任何地方调用每个版本,不需要类的和类的对象,例如,可以用下面的行m1调用A块中的main‘s Main.m1(); // ClassName.StaticMethodName();方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62673091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档