什么是内部类:

内部类就是定义在一个类内部的类,我们分为四种:成员内部类,静态内部类,方法内部类,匿名内部类

为什么用内部类?

内部类的好处是:每个内部类都可以独立的继承或者访问接口,与外部类完全不管

 

成员内部类:

package lei;
//成员内部类
public class ChengYuan {
    public class InnerChengYuan{
        
    }
}

成员内部类的应用:

package lei;
//成员内部类
// 成员内部类是依附外部类的,只有创建了外部类才能创建内部类
public class ChengYuan {
    //定义外部类非静态变量,想要通过内部类访问到,代码19-20行
    String Outinner="out inner";
    public static void main(String[] args) {
        // 成员内部类 :新建内部类的对象
        ChengYuan.InnerChengYuan inner=new ChengYuan().new InnerChengYuan();
        // 成员内部类: 访问成员内部类的方法,通过新建的内部类对象.的形式来访问内部类方法
        inner.show();
        // 成员内部类:通过创建内部类对象,然后通过对象.的方式来访问内部类属性
        System.out.println(inner.name);

    }
    public class InnerChengYuan{
        String name="3";
        public void show(){
            //方法访问内部类成员变量
            System.out.println(name);
            //访问外部类成员变量,先new一个外部类对象,通过外部类对象能够访问到外部类成员变量
            ChengYuan cy=new ChengYuan();
            System.out.println(cy.Outinner);
        }
    }
}

静态内部类:

由static关键字修饰的内部类,

静态内部类不需要依靠外部类便可以创建(static关键字),并且静态内部类不能访问外部类的非静态的属性和方法,但可以拥有自己的成员变量。

package neibulei;

public class OutStatic {
    //静态内部类
    public static class InnerStatic{
        
    }
}

静态内部类的访问方式

package neibulei;

public class OutStatic {
    //创建外部类的静态成员变量 代码18行
    static int c=3;
    //静态内部类
    public static class InnerStatic{
        //创建内部类静态对象    代码:6,10行引用
        static int a=1;
        //静态内部类非静态对象 代码13行
        int b=2;
        public  void show(){
            //静态内部类可以直接访问到内部类的静态成员变量
            System.out.println(a);
            //静态内部类方法可以直接访问到内部类非静态成员变量
            System.out.println(b);
            //静态内部类可以直接访问到非静态外部类的静态变量
            System.out.println(c);
        }
    }

    public static void main(String[] args) {
        //访问静态内部类的方法:可以直接创建内部类对象,然后对象.的形式来进行调用
        InnerStatic innerStatic =new InnerStatic();
        innerStatic.show();
        //访问静态内部类的方法:因为是static 所以可以和静态常量一样可以用类名.的方式来进行访问
        //这里OutStatic.innerStatic();是通过外部类.的方式访问内部类 然后创建对象。
        OutStatic.InnerStatic i=new OutStatic.InnerStatic();
        i.show();
    }
}

方法内部类

方法内部类就是直接在类中的方法定义一个类,这个类伴随着方法生存,方法在,这个类就在,方法消失,这个类也就消失

package fangfaClass;

public class MethodOut {
    //外部类方法
    public void method(){
        //方法中写一个类:叫做方法内部类,这个类伴随着方法存在,方法在类就在
        class MethodInner{
            public void show(){
                System.out.println("方法内部类");
            }
        }
        //因为类存在方法中,所以只能在方法中访问
        MethodInner m=new MethodInner();
        m.show();
    }
}

匿名内部类:

匿名内部类就是一个没有名字的方法内部类,因此特点和方法与方法内部类完全一致,匿名内部类的特点:
1.匿名内部类必须继承一个抽象类或者实现一个接口。
2.匿名内部类没有类名,因此没有构造方法。

 

先写一个抽象类:

package ni;

public abstract class Abstract {
    abstract void show();
}

使用匿名内部类继承这个抽象类

package ni;
interface Myinterface{
    public void show();
}

public class NiClass {

    //相当于子类继承了这个抽象类,然后对抽象类的抽象方法进行重写,这种情况叫匿名内部类
    Abstract a=new Abstract() {
        @Override
        void show() {

        }
    };
    //===========================
    //想当于调用子类调用了Myinterface的接口,然后进行重写方法。
    Myinterface mi=new Myinterface() {
        @Override
        public void show() {
            
        }
    }
}