Java的内部类总结

2022-01-07

目录
  • 前言
  • 一,成员内部类
    • 1,成员内部类的特点
    • 2,成员内部类的实现
    • 3,内部类和外部类的关系
  • 二,静态内部类
    • 1,静态内部类的特点
    • 2,比较成员内部类和静态内部类
    • 3,静态内部类的实现
  • 三,方法内部类
    • 1,方法内部类的特点
    • 2,方法内部类的实现
  • 四, 匿名内部类
    • 1,匿名内部类的特点
    • 2,匿名内部类的实现
  • 总结

    前言

    最近看了内部类后,总结一下,首先内部类嵌套在其他内部的类,根据出现的位置和关键字,可以分为以下四种类:成员内部类,静态内部类,方法内部类,匿名内部类,接下来就介绍下这四种类,记得耐心看哦

    一,成员内部类

    1,成员内部类的特点

    (1)private不可以用在外部类的声明,但可在内部类声明,成员变量可以是private

    (2)内部类,外部类可以相互访问彼此的私有域

    A:内部类访问外部类的私有域可以直接访问,因为成员内部类含有隐藏对象

    B:外部类访问内部类的私有域通过内部类对象访问

    (3)内部类可解决Java中单继承问题

    (4)内部类可以对外部隐藏

    2,成员内部类的实现

    public class Outter {    // 成员变量    private int age = 12;    private String name = "zh";    private static final int A = 20;    //成员内部类    class Inner{        private String a = "hello";        private int age = 20;        public void test(){            System.out.println(a);            // 可以访问外部类的私有域age            System.out.println(Outter.this.age);            //访问自己的age            System.out.println(this.age);            System.out.println(A);        }    }    // 外部类成员方法    public void fun() {        int a = 0;        // 外部类内部创建内部类对象        Inner inner = new Inner();        System.out.println(inner.a);    }}class Test {    public static void main(String[] args) {    //外部类的外部创建内部类对象        Outter.Inner inner = new Outter().new Inner();    }}public class Outter {
        // 成员变量
        private int age = 12;
        private String name = "zh";
        private static final int A = 20;
        //成员内部类
        class Inner{
            private String a = "hello";
            private int age = 20;
            public void test(){
                System.out.println(a);
                // 可以访问外部类的私有域age
                System.out.println(Outter.this.age);
                //访问自己的age
                System.out.println(this.age);
                System.out.println(A);
            }
        }
        // 外部类成员方法
        public void fun() {
            int a = 0;
            // 外部类内部创建内部类对象
            Inner inner = new Inner();
            System.out.println(inner.a);
        }
    }
    class Test {
        public static void main(String[] args) {
        //外部类的外部创建内部类对象
            Outter.Inner inner = new Outter().new Inner();
        }
    }
    

    3,内部类和外部类的关系

    A:成员内部类的创建需要依赖于外部类对象

    B:内部类和外部类之间相互独立

    C:两者的私有属性可以相互访问

    D:语法

    (1)外部类的内部创建内部类对象

    Inner inner = new Inner();
    

    (2)外部类的外部创建内部类对象

    Outter.Intter intter = new Outter().new Intter();
    

    E:在内部类的内使用隐藏的this

    二,静态内部类

    1,静态内部类的特点

    (1)定义在外部类的内部使用static修饰,静态内部类无需外部类无需外部类产生对象就可以使用

    (2)静态内部类的创建语法

      StaticInnerClass.Inner inner = new StaticInnerClass.Inner();

    2,比较成员内部类和静态内部类

    (1)成员内部类不能拥有静态域,但可以访问外部的静态域

    (2)静态内部类可以拥有成员域,但不能访问外部的成员域

    3,静态内部类的实现

    public class StaticInnerClass {
        static int age;
        String name;
        //静态内部类--类比--静态变量
        static class Inner{
            private int age;
            public void test(){
                System.out.println(age);
    //            System.out.println(name);不能访问外部成员域
            }
        }
        public void fun() {
            Inner inner = new Inner();
        }
    }
    class Test1 {
        public static void main(String[] args) {
            StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
        }
    }
    

    三,方法内部类

    1,方法内部类的特点

    (1)方法内部类定义在方法内部

    (2)对外部完全隐藏,因此不能有任何访问修饰

    (3)若要方法的形参只能用,不能改(形参的隐式final声明)

    2,方法内部类的实现

    //方法内部类
    public class FunClass {
        private int age;
        public void fun(int age) {
            class Inner {
                void fun() {
    //                System.out.println(age);
                }
            }
            age = 10;
        }
    }
    

    四, 匿名内部类

    1,匿名内部类的特点

    (1)匿名内部类定义在方法内部,类没有名字

    (2)必须继承一个抽象类或者实现一个接口

    (3)没有构造方法

    2,匿名内部类的实现

    //实现接口interface IMessage {    void fun();}public class NonNameClass {    public static void main(String[] args) {        //匿名内部类        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                System.out.println("hello A");            }        });        Thread thread1 = new Thread({                System.out.println("hello ");        } );        thread.start();        thread1.start();    }}//实现接口
    interface IMessage {
        void fun();
    }
    public class NonNameClass {
        public static void main(String[] args) {
            //匿名内部类
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello A");
                }
            });
            Thread thread1 = new Thread({
                    System.out.println("hello ");
            } );
            thread.start();
            thread1.start();
        }
    }
    

    总结

    朋友们,看到最后是不是对内部类有了新的认识?

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注北冥有鱼的更多内容!

    《Java的内部类总结.doc》

    下载本文的Word格式文档,以方便收藏与打印。