美文网首页
内部类应用

内部类应用

作者: 康康不遛猫 | 来源:发表于2017-11-12 11:17 被阅读0次

    一、静态内部类和非静态内部类
    (1)内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。
    (2)非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。
    (3)一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。

    /* 下面程序演示如何在java中创建静态内部类和非静态内部类 */
    class OuterClass{
      private static String msg = "GeeksForGeeks";
      // 静态内部类
      public static class NestedStaticClass{
        // 静态内部类只能访问外部类的静态成员
        public void printMessage() {
         // 试着将msg改成非静态的,这将导致编译错误 
         System.out.println("Message from nested static class: " + msg); 
        }
      }
      // 非静态内部类
      public class InnerClass{
        // 不管是静态方法还是非静态方法都可以在非静态内部类中访问
        public void display(){
         System.out.println("Message from non-static nested class: "+ msg);
        }
      }
    } 
    class Main
    {
      // 怎么创建静态内部类和非静态内部类的实例
      public static void main(String args[]){
        // 创建静态内部类的实例
        OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();
        // 创建静态内部类的非静态方法
        printer.printMessage();  
        // 为了创建非静态内部类,我们需要外部类的实例
        OuterClass outer = new OuterClass();    
        OuterClass.InnerClass inner = outer.new InnerClass();
        // 调用非静态内部类的非静态方法
        inner.display();
        // 我们也可以结合以上步骤,一步创建的内部类实例
        OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();
        // 同样我们现在可以调用内部类方法
        innerObject.display();
      }
    }
    

    二、单例与内部类
    同时实现延迟加载和线程安全(比加锁+double check性能好)

    public class Singleton_InnerClass {
            
     private static class SingletonHolder{
      //静态初始化器,由JVM来保证线程安全
      private static Singleton_InnerClass instance=new Singleton_InnerClass();
     }
     
     //私有化构造方法
     private Singleton_InnerClass(){
      
     }
     
     public static Singleton_InnerClass getInstance(){
      return SingletonHolder.instance;
     }
    }
    

    饿汉式

    public class Singleton {  
        private static Singleton instance = new Singleton();  
        private Singleton (){}
        public static Singleton getInstance() {  
        return instance;  
        }  
    } 
    //基于classloder机制避免了多线程的同步问题,不过instance在类装载时就实例化
    

    懒加载式:锁+双重检查

     public class Singleton {  
         private volatile static Singleton singleton;  //volatile 
         private Singleton (){}   
         public static Singleton getSingleton() {  
         if (singleton == null) {  
             synchronized (Singleton.class) {  
             if (singleton == null) {  //双重检查
                 singleton = new Singleton();  
             }  
             }  
         }  
         return singleton;  
         }  
     }  
    

    三、内部类解决Spring多线程注入

    @Service
    class TestExample{
    
        //这两个为线程所需要的Bean
        @Resource
        TestDao testDao;
    
        @Resource
        NeedDap needDao;
    
        public void serviceExecute(){
            //在这里开启线程,执行操作
            ThreadExample te = new ThreadExample();
            te.start();
        }
        
        //内部类
        private class ThreadExample extends Thread{
    
            public ThreadExample(){
                //也可以在构造函数中传入参数
            }
            public void run(){
                //这里为线程的操作
                //就可以使用注入之后Bean了
    
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:内部类应用

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