Java教程

内部类详解

本文主要是介绍内部类详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

内部类

  1. 成员内部类
  2. 静态内部类
  3. 局部内部类
  4. 匿名内部类

什么是内部类

概念:在一个类的内部再定义一个完整的类

class Outer{
    class Inner{
        
    }
}

特点:

  • 编译之后可生成独立的字节码文件
  • 内部类可直接访问外部类的私有成员,而不破坏封装。
  • 可为外部类提供必要的内部功能组件。

成员内部类

  • 在类的内部定义,与实例变量(属性)、实例方法同级别的类。

  • 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。

    • Outer out = new Outer();
      Inner in = new Inner();
      

MemberInner.java

package com.commonClass.demo01;

//外部类
public class MemberInner {
    //实例变量(属性)
    private String name = "大白很白";
    private int age = 100;

    //内部类
    class Inner{
        private String address = "火星";
        private String phone = "130";

        //方法
        public void show(){
            //打印外部类的属性
            System.out.println(name);
            System.out.println(age);

            //打印内部类中的属性
            System.out.println(address);
            System.out.println(phone);
        }
    }
}

TestOuter.java

package com.commonClass.demo01;

public class TestOuter {
    public static void main(String[] args) {
        //1.创建外部类对象
       // MemberInner memberInner = new MemberInner();
        //2.创建内部类对象
       // MemberInner.Inner inner = memberInner.new Inner();

        //一步到位
        MemberInner.Inner inner = new MemberInner().new Inner();

        inner.show();
        /*
        大白很白
		100
		火星
		130
		*/
    }
}
  • 当外部类、内部类存在重名属性时,会优先访问内部类属性。 如果要访问外部类属性,需加 类名Outer.this.属性
  • 成员内部类不能定义静态成员。 但可定义静态常量 static final

静态内部类

  • 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。

  • 只能直接访问外部类的静态成员(实例成员需实例化外部类对象)。

    Outer.Inner inner = new Outer.Inner();
    Outer.Inner.show();
    

Outer.java

package com.commonClass.demo02;

public class Outer {
    private String name = "我的母语是无语";
    private int age = 100;

    //静态内部类:级别和外部类相同
    static class Inner{
        private String address = "地球";
        private String phone = "111";
        //静态成员
        private static int count = 1000;

        public void show(){
            //调用外部类的属性
            //1.先创建外部类对象
            Outer outer = new Outer();
            System.out.println(outer.name);
            System.out.println(outer.age);
            //调用静态内部类的属性和方法
            System.out.println(address);
            System.out.println(phone);
            //调用静态内部类的静态属性
            System.out.println(Inner.count);


        }

    }
}

TestOuter.java

package com.commonClass.demo02;

public class TestOuter {
    public static void main(String[] args) {
        //直接创建静态内部类对象
        Outer.Inner inner = new Outer.Inner();
        //调用方法
        inner.show();
        /*
        我的母语是无语
        100
        地球
        111
        1000
         */
    }
}

局部内部类

  • 定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。

  • 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。

  • 限制类的使用范围。

Outer.java

package com.commonClass.demo03;

//外部类
public class Outer {
    private String name = "野猪";
    private int age = 10;

    public void show(){
        //定义局部变量
        String address = "亚特兰蒂斯";//省略final

        //局部内部类:不能加任何访问修饰符
        class Inner{
            //局部内部类的属性
            private String phone = "123456";
            private String email = "dabai@123.com";
            //private final static int count = 12;

            public void show2(){
                //访问外部类的属性
                System.out.println(name);//省略了Outer.this.
                System.out.println(age);//省略了Outer.this.
                //访问内部类的属性
                System.out.println(phone);//省略了this.
                System.out.println(email);//省略了this.
                //访问局部变量,jdk1.7要求,变量必须是常量final,jdk1.8自动添加final
                System.out.println(address);//变为常量:亚特兰蒂斯
            }

        }
        //创建局部内部类对象
        Inner inner = new Inner();
        inner.show2();
    }
}

TestOuter.java

package com.commonClass.demo03;

public class TestOuter {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.show();
        /*
        野猪
        10
        123456
        dabai@123.com
        亚特兰蒂斯
         */

    }
}

匿名内部类

  • 没有类名的局部内部类(一切特征都与局部内部类相同)。
  • 必须继承一个父类或者实现一个接口。
  • 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。
  • 优点:减少代码量。
  • 缺点:可读性较差。

Usb.java

package com.commonClass.demo04;

//接口
public interface Usb {
    //服务
    void service();
}

Mouse.java

package com.commonClass.demo04;

public class Mouse implements Usb{
    @Override
    public void service() {
        System.out.println("连接电脑成功,鼠标开始工作了...");

    }
}

TestUsb.java

package com.commonClass.demo04;

public class TestUsb {
    public static void main(String[] args) {
        //创建接口类型的变量
        //Usb usb = new Mouse();
        //usb.service();//连接电脑成功,鼠标开始工作了...

        //局部内部类
/*        class Fan implements Usb{
            @Override
            public void service() {
                System.out.println("连接电脑成功,风扇开始工作了...");
            }
        }
*/
        //Usb usb = new Fan();
        //usb.service();//连接电脑成功,风扇开始工作了...


        //使用匿名内部类优化(相当于创建了一个局部内部类)
        Usb usb = new Usb() {
            @Override
            public void service() {
                System.out.println("连接电脑成功,风扇开始工作了...");

            }
        };
        usb.service();//连接电脑成功,风扇开始工作了...

    }
}
这篇关于内部类详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!