java之内部类

如果一个类存在的意义就是为指定的另一个类,可以把这个类放入另一个类的内部。就是把类定义在类的内部的情况就可以形成内部类的形式。A类中又定义了B类,B类就是内部类。B类可以当做A类的一个成员看待。

特点

  •  内部类可以直接访问外部类中的成员,包括私有成员
  • 外部类要访问内部类的成员,必须要建立内部类的对象
  • 在成员位置的内部类是成员内部类
  • 在局部位置的内部类是局部内部类

私有成员内部类——被private修饰

// 创建外部类2
class Outer2 {
    
    public void callIn() {
        new Inner2().in();
    }
    // 成员内部类:类里方法外
    // 成员内部类被private修饰,表示内部类私有化,外界无法直接访问内部类,也无法创建对象
    private class Inner2 {
        public void in() {
            System.out.println("内部类");
        }
    }
    
}

public class Test_InnerClass {

    public static void main(String[] args) {
       // 调用私有内部类的方法  
       new Outer2().callIn();

    }

}

静态内部类——被static修饰

// 创建外部类
class Outer {
    // 内部类被static修饰  消耗内存资源
    static class Inner  {
        public void in() {
            System.out.println("内部类");
        }
        public static void in2() {
            System.out.println("内部类静态方法");
        }
    }
}

public class Tes_inner {

    public static void main(String[] args) {
        Outer.Inner oi = new Outer.Inner();
        oi.in(); // 调用静态内部类的非静态方法
        Outer.Inner.in2();   //  调用静态内部类的静态方法 --> 链式编程
    }

}

匿名内部类

// 定义抽象类
abstract class Animal {
    public abstract void eat();
    public abstract void sleep();
}

// 定义接口
interface Fly {
    void fly();
}


public class Test6_LocalInner {

    public static void main(String[] args) {
   // 实现抽象类的匿名内部类
        new Animal(){

            @Override
            public void eat() {
                System.out.println("小动物在吃...");
            }

            @Override
            public void sleep() {
                System.out.println("小动物在睡...");
            }
            
        }.sleep();  // 小动物在睡...
        
        // 实现接口的内部类
        new Fly() {

            @Override
            public void fly() {
                System.out.println("我会飞...");
            }
            
        }.fly();

    }
}

 

posted @ 2020-03-13 22:03  技术狂-CYL  阅读(73)  评论(0)    收藏  举报