内部类

概念:在java中,一个类也可以定义在一个类的内部,定义在内部的类称为内部类(inner class),定义在外部的类称为外部类(out class)

语法:

public class Outer {
    
    [修饰符] class Inner{
        
    }
}

经过编译后这两个类是平行关系

分类:

一:成员内部类

上面的例子就是成员内部类,成员内部类一般都用默认修饰符

(1)内部类怎么创造对象呢

public class Test01 {
    public static void main(String[] args) {
        
        // 【1】先创建外部类对象
        Outer outer = new Outer();
        // 【2】创建内部类对象
        Inner inner = outer.new Inner();
        inner.showInfo();
    }
}

(2)内部类可以访问外部类的私有成员变量(原理:作用域作用)

public class Outer {
    
    private String name = "Outer";
    
    class Inner{
        
        public void showInfo() {
            System.out.println(name);
        }
        
    }
}

特殊情况:如果内部类变量名和外部类变量名相同,那访问形式是

public class Outer {
    
    private String name = "Outer";
    
    class Inner{
        
        private String name = "Inner";
        
        public void showInfo() {// 访问外部类的私有成员
            System.out.println(this.name);
            
            // 访问外部类的私有成员
            System.out.println(Outer.this.name);
            
        }
    }
}

二:静态内部类

也就是内部类被static修饰符修饰了

(1)创建静态内部类

public class Test01 {
    public static void main(String[] args) {
        
        Inner inner = new Outer.Inner();
        inner.showInfo();
    }
}

(2)静态内部类可以访问外部内的(私有)静态成员

public class Outer {
    
    private static String name = "Outer";
    
    static class Inner{
        
        public void showInfo() {
            System.out.println("showInfo");
            
            System.out.println(name);
        }
    }
}

三:方法内部类

将类定义到方法中

public class Outer {
    
    public void print() {
        
        class Inner{        
            public void showInfo() {
                System.out.println("show info");
            }
        }
         
        Inner inner = new Inner();
        inner.showInfo();
    }
}

注意:如果方法中的变量进入该内部类,那么自动被final修饰变成常量

public class Outer {
    
    public void print(int b) {
        
        int a = 10;
        
        class Inner{
            
            public void showInfo() {
                System.out.println("show info");
                
                System.out.println("print() ->a:"+10);
                
                // 在方法内部类中不能修改方法的局部变量(final)
                // a = 20;
                // b = 20;
            }
        }
        
        a = 20;
        
        Inner inner = new Inner();
        inner.showInfo();
    }
}

四:匿名内部类

如果要使用的类未来只会用到一次,那么可以声明该类为匿名的

*匿名内部类一定要实现接口

package cn.sxt01.inner04;

public class Outer {
    
    public void print() {
        
        // 方法内部类
        /*class Inner implements MyInterface{

            @Override
            public void showInfo() {
                System.out.println("Inner:showInfo");
            }
            
        }*/
        
        /*Inner inner = new Inner();
        inner.showInfo();*/
        
        // new Inner().showInfo();
        
        // 匿名内部类
        new MyInterface(){
            @Override
            public void showInfo() {
                System.out.println("Inner:showInfo");
            }
        }.showInfo();
        
    }
}

 

posted @ 2019-04-26 19:27  c++天下第一  阅读(650)  评论(0编辑  收藏  举报