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 }
  • 相关阅读:
    JavaWeb工程中web.xml基本配置
    json
    理解文档对象模型(3)
    关于经验模态分解的混叠模态(mode mixing)问题
    android ListView SimpleAdapter 带图片
    JAVA的类和对象
    JAVA的循环结构进阶
    JAVA的数组
    JAVA的循环结构
    JAVA的选择结构(二)
  • 原文地址:https://www.cnblogs.com/shen-smile/p/5136722.html
Copyright © 2011-2022 走看看