美文网首页
内部静态类问题

内部静态类问题

作者: bobcorbett | 来源:发表于2017-08-15 14:10 被阅读0次

在hackerrank上面遇到了一道问题涉及到Java的内存机制。

代码如下:

package com.company;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.Permission;


public class Solution {

   public static void main(String[] args) throws Exception {
       DoNotTerminate.forbidExit();

       try{
           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           int num = Integer.parseInt(br.readLine().trim());
           Object o;// Must be used to hold the reference of the instance of the class Solution.Inner.Private
           o = new Inner().new Private();
           System.out.println(((Inner.Private) o).powerof2(num));
           System.out.println("An instance of class: " + o.getClass().getCanonicalName() + " has been created");
       }//end of try

       catch (DoNotTerminate.ExitTrappedException e) {
           System.out.println("Unsuccessful Termination!!");
       }
   }//end of main
   static class Inner{
       private class Private{
           private String powerof2(int num){
               return ((num&num-1)==0)?"power of 2":"not a power of 2";
           }
       }
   }//end of Inner

}//end of Solution

class DoNotTerminate { //This class prevents exit(0)

   public static class ExitTrappedException extends SecurityException {

       private static final long serialVersionUID = 1L;
   }

   public static void forbidExit() {
       final SecurityManager securityManager = new SecurityManager() {
           @Override
           public void checkPermission(Permission permission) {
               if (permission.getName().contains("exitVM")) {
                   throw new ExitTrappedException();
               }
           }
       };
       System.setSecurityManager(securityManager);
   }
}

其中Inner是static的,我一开始觉得第17行代码应该这么写:

o = Inner.new Private();

因为Inner是一个静态类。

结果编译器报错了。

查了一下discussion里面的留言,发现也有人遇到相同问题:

image.png

网友回复:

image.png

所以17行可以改为这样:

o = new Solution.Inner().new Private();

关于静态内部类实例化的解释:
非静态内部类是附属在外部类对象上的,需要先实例化一个外部类的对象,通过外部类对象才能实例化非静态内部类;
而静态内部类可以看做是直接附属在外部类上的,这个静态代表附属体是外部类,而不是外部类实例;
外部类在进程中是唯一的,而静态内部类不需要唯一,可以生成多个实例。

静态内部类不依赖于外围类的事例,而不是说不依赖于类的实例。

这样实际上使静态内部类成为了一个顶级类。

相关文章

  • 内部静态类问题

    在hackerrank上面遇到了一道问题涉及到Java的内存机制。 代码如下: 其中Inner是static的,我...

  • Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类静态内部类匿名类本地类 步骤 1 : 非静态内部类 非静态内部类 ...

  • 线程-ThreadLocal

    类结构: ThreadLocal类中有个ThreadLocalMap内部静态类。内部静态类和外部类,可以单独存在,...

  • 什么是Java内部类

    定义 在Java类的{}代码块内部中定义的类称为内部类 内部类分为两种,静态内部类和非静态内部类 要点 静态内部类...

  • java-内部类

    内部类与类的属性没有什么区别。静态内部类,非静态内部类在new时有区别。静态内部类类似于外部类的类变量,非静态内部...

  • Java-嵌套类

    嵌套类分为两类:静态和非静态。被声明static的嵌套类称为静态嵌套类。非静态嵌套类称为内部类。内部类有两种特殊的...

  • 那些经常被遗忘的面试题,你知道几个?

    静态类和静态方法 如果一个类被声明为静态的,那么只有一种情况,即静态内部类。 静态内部类实际上与普通类(即类名必须...

  • JAVA 面试,你常常忘记它们

    静态类和静态方法 如果一个类要被声明为static的,只有一种情况,就是静态内部类。静态内部类实际上与普通类(即类...

  • java 内部类

    内部类分为以下四种: 静态内部类 成员内部类 局部内部类 匿名内部类 一、静态内部类 静态内部类: 在类中用sta...

  • java静态类

    java静态类只能是内部静态类,如果外部类被声明为static,将导致编译不通过。 静态内部类只能访问静态成员和静...

网友评论

      本文标题:内部静态类问题

      本文链接:https://www.haomeiwen.com/subject/upamrxtx.html