Java之接口与内部类6.3.1--内部类

阅读更多

package com.aowin.define;

//内部类使用的场合
//1.针对接口或抽象类这些不能直接new创建对象的数据类型,使用匿名内部类创建对象
//2.完成复杂的功能,设计辅助外部类的类,并不想把类的细节公布出去,可以使用内部类
//内部类的好处:可以共享外部类的数据,包括私有的
public class Outter {
    
    //静态成员变量
    private static double pi=3.14;
    
    //非静态的成员
    private String str = "hello";
    
    
    //非静态内部类
    //可以访问外部类的静态成员和非静态成员,包括private修饰的
    //创建非静态内部类对象依赖于外部类对象
    class Inner{        
        public void print(){
            System.out.println("非静态内部类中访问:");
            System.out.println("静态成员pi="+pi);
            System.out.println("非静态成员str="+str); 
        }        
    }
    
    //静态内部类:static修饰的内部类
    //可以访问外部类的静态成员,包括private修饰的,但不能访问外部类非静态的成员
    //创建静态内部类对象可以通过外部类类名
    static class Static_Inner{
        public void print(){
            System.out.println("静态内部类中访问:");
            System.out.println("静态成员pi="+pi);
            //System.out.println("非静态成员str="+str);  //不能访问外部类非静态的成员
        }
    }
    
    //局部内部类:定义在方法中的内部类
    //可以访问外部类中静态成员和非静态成员,包括private修饰的
    //可以访问局部常量(final修饰的),不能访问局部变量(jdk1.7)    
    public void test(){
        int i=10;            //局部变量
        final int I =100;    //局部常量
        
        class Local{            
            public void print(){
                System.out.println("局部内部类中访问:");
                System.out.println("静态成员pi="+pi);
                System.out.println("非静态成员str="+str); 
                //System.out.println("局部变量i="+i); //不能访问局部变量
                System.out.println("局部常量I="+I);     //可以访问局部常量,局部常量的生存周期比较长
            }            
        }
        
        //在方法中创建局部内部类对象
        Local lc = new Local();        
        lc.print();        
    }
    
    
    //匿名内部类
    //针对接口或抽象类这些不能直接new创建对象的数据类型,通过匿名内部类创建对象
    //匿名内部类创建对象只能使用一次
    //主要用于事件监听器的创建
    
    public void test2(){
        //Anonymous定义的是抽象类,不能直接new创建对象,通过匿名内部类创建对象
        Anonymous ano = new Anonymous(){

            @Override
            public void abs() {
                System.out.println("abs()");                 
            }
            
        };
        
        ano.abs();            
    }
    
    

}

 

package com.aowin.define;

public abstract class Anonymous {
    
    public abstract void abs();
    

}
 

package com.aowin.define;

import com.aowin.define.Outter.Inner;

public class Test {
    
    public static void main(String[] args) {
        //创建外部类对象
        Outter out = new Outter();
        //创建非静态内部类对象,依赖于外部类对象
        Inner in = out.new Inner(); 
        in.print();
        
        //创建静态内部类对象,通过外部类类名
        Outter.Static_Inner s_in = new Outter.Static_Inner();
        s_in.print();
        
        //运行局部内部类中的方法
        new Outter().test();
        
        //运行匿名内部类中的方法
        new Outter().test2();
    }

}
 

转载于:https://my.oschina.net/Watto/blog/873558

你可能感兴趣的:(Java之接口与内部类6.3.1--内部类)