zoukankan      html  css  js  c++  java
  • 静态方法中不能new内部类的实体对象

    原因如下:

    1.内部类可以访问外部类的成员变量

    2.对象创建完成后对象的成员变量才会被分配空间

    3.main的静态方法执行时可以不存在外部类,不创建实体对象

    4.内部类能访问成员变量意味着一定存在外部类实体对象

    因为3和4矛盾,所以在静态方法中不能new内部类的实体对象

    解决办法1:新建一个非静态方法init(),在init()方法中new内部类的实体对象.然后在静态方法main中新建一个外部类的实体对象去调用init()方法

    示例代码:

     1 /*
     2  * Test类本身就是外部类
     3  */
     4 public class Test {
     5     public static void main(String[] args) {
     6         new Test().init();//此处为新建的外部类的实体对象
     7     }
     8     //新建一个非静态方法,在这个方法的内部new内部类的实体对象
     9     private void init(){
    10         Outputer outputer = new Outputer();
    11         new Thread(new Runnable(){
    12             public void run() {
    13                 while(true){
    14                     try {
    15                         Thread.sleep(10);
    16                     } catch (InterruptedException e) {
    17                         e.printStackTrace();
    18                     }
    19                     outputer.output("shen_smile");
    20                 }
    21             }
    22         }).start();
    23     }
    24     //内部类
    25     class Outputer{
    26         public void output(String name){
    27             int len = name.length();
    28             for(int i=0;i<len;i++){
    29                 System.out.print(name.charAt(i));
    30             }
    31             System.out.println();
    32         }
    33     }
    34 }

    解决办法2:如果想直接在静态方法中new内部类的实体对象,不想使用方法1,可以将内部类加static修饰,然后在new内部类时加final关键字修饰

    示例代码:

     1 /*
     2  * Test类本身就是外部类
     3  */
     4 public class Test {
     5     public static void main(String[] args) {
     6         final Outputer outputer = new Outputer();
     7         new Thread(new Runnable(){
     8             public void run() {
     9                 while(true){
    10                     try {
    11                         Thread.sleep(10);
    12                     } catch (InterruptedException e) {
    13                         e.printStackTrace();
    14                     }
    15                     outputer.output("shen_smile");
    16                 }
    17             }
    18         }).start();
    19     }
    20     //内部类
    21     static class Outputer{
    22         public static void output(String name){
    23             int len = name.length();
    24             for(int i=0;i<len;i++){
    25                 System.out.print(name.charAt(i));
    26             }
    27             System.out.println();
    28         }
    29     }
    30 }
  • 相关阅读:
    空指针调用函数【可以成功】
    静态库的pdb
    构造、析构、虚函数使用小细节
    Hutool,一个贼好用的 Java 工具类库,用过都说好~
    kk-anti-reptile是,适用于基于spring-boot开发的分布式系统的反爬虫组件。
    对于thinkpad 触摸板双击失灵
    tomcat7-maven-plugin 启动的服务如何关闭
    怎样关闭占用80端口的pid为4的进程
    C# 时间比较
    一道sql面试题
  • 原文地址:https://www.cnblogs.com/shen-smile/p/5136722.html
Copyright © 2011-2022 走看看