Java 内部类

Java内部类分为几个类型:

  (1)成员内部类

  (2)方法内部类

  (3)静态内部类

  (4)匿名内部类

      匿名内部类分为三种:继承式的匿名内部类、接口式匿名内部类、参数式匿名内部类

 

成员内部类:

public class TestInnerClass {
    public static void main(String[] args) {
        //调用成员内部类有两种方式
        //方法一:使用外部类来调用创建内部类
        Outer out = new Outer();
        Outer.Inner inner = out.new Inner();
        inner.print();
        
        //方法二:调用普通方法来调用内部类
        out.show();
    }
}

class Outer{
    
    public String name;
    
    //方法二:在类中定义方法,来调用内部类
    public void show() {
        Inner inner = new Inner();
        inner.print();
    }
    
    //成员内部类
    public class Inner{        
        public void print() {
            System.out.println("成员内部类");
        }
    }    
}

 

方法内部类:

public class TestInnerClass {
    public static void main(String[] args) {
        
        Outer out = new Outer();
        out.show();
    }
}

class Outer{
    
    public String name;
    public void show() {
        //方法内部类只能在定义该内部类的方法中进行实例化
        //方法内部类不能使用方法中的非final变量,show()方法的形参或局部变量必须是final
        class Inner{
            private void print() {
                System.out.println("方法内部类");
            }
        }
        Inner inner = new Inner();
        inner.print();
    }
    
}

 静态内部类:

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

class Outer{
    
    public String name;

    //静态内部类的含义是该内部类可以和其他静态成员一样,没有创建对象也可以访问它
    //静态内部类仅能访问外部类的静态成员和静态方法
    static class Inner{
        public void print() {
            System.out.println("我是内部类");
        }
    }    
}

匿名内部类:

(1)继承式匿名内部类

public class TestInnerClass {
    public static void main(String[] args) {
        
        Cat cc = new Cat() {
            @Override
            public void eat() {
                System.out.println("继承式匿名内部类");
            }            
        };
    }
}

abstract class Cat{
    public abstract void eat();
}

(2)接口式匿名内部类

public class TestInnerClass {
    public static void main(String[] args) {
        
        Dog dd = new Dog() {

            @Override
            public void eat() {
                System.out.println("接口式匿名内部类");                
            }            
        };
    }
}

interface Dog{
    public void eat();
}

(3)参数式匿名内部类

public class TestInnerClass {
    public static void main(String[] args) {
        
        show(new Dog() {
            public void eat() {
                System.out.println("参数内部类");
            }
        });
    }
    
    public static void show(Dog dd) {
        dd.eat();
    }
}

interface Dog{
    public void eat();
}

 

posted @ 2022-05-17 20:14  藤原豆腐渣渣  阅读(39)  评论(0编辑  收藏  举报