栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 内部类总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 内部类总结

目录

1. 什么是内部类

2. 为什么会有内部类的产生

3. 成员内部类

3.1 用法

3.3 成员内部类和外部类的区别和联系

4. 静态内部类

5. 方法内部类

6. 匿名内部类


1. 什么是内部类

嵌套在其他类内部的类,根据出现的位置和关键字可以分为以下四种内部类:成员内部类、静态内部类、方法内部类、匿名内部类。

2. 为什么会有内部类的产生
  • 内部类与外部类可以互相访问彼此的私有域:内部类访问外部类的私有域可以直接访问,外部类访问内部类的私有域必须通过内部类对象访问;
  • 内部类可以变相的解决 Java 单继承局限;
  • 内部类可以对外部隐藏(LinkedList 中的 Node 类)。

3. 成员内部类

成员内部类的用法和成员方法差不多.

3.1 用法

代码示例:

package demo.inner;

public class Outter {
    // 外部类私有域 成员变量
    private int age = 18;
    private String name = "lisi";

    // 成员内部类
    class Inner {
        private String msg = "Inner class";
        private int age = 20;
        public void test() {
            System.out.println(msg);
            System.out.println(this.age);
            // 内部类访问外部类的私有域
            System.out.println(Outter.this.age);
        }
    }

    // 外部类成员方法
    public void func() {
        // 创建内部类对象
        Inner inner = new Inner();
        // 外部类通过内部类对象访问内部类私有域
        System.out.println(inner.msg);
    }

    public static void main(String[] args) {
        Outter outter = new Outter();
        outter.func();
        Outter.Inner inner = new Outter().new Inner();
        inner.test();
    }
}

1. 创建内部类的语法:

a. 在外部类内部创建内部类对象 内部类名 inner = new 内部类名();

b. 在外部类的外部创建内部类对象(前提内部类不是 private)外部类.内部类 inner = new Outter().new Inner();

2. 内部类可以变相的解决 Java 单继承局限。

上述例子中 InnerExtend 类没有直接继承 A类 和 B类,但是通过它的内部类 InnerA 和 InnerB 这两个内部类继承了 A类 和 B类,从而使 InnerExtend 类获取了这两个类的私有域,解决了 Java 中只能单继承的局限。但实际内部类也还是单继承,只是使用了多个内部类。

3. 内部类可以对外部隐藏(LinkedList 中的 Node 类)。

4. 成员内部类类比成员方法,不能拥有静态域,但可以访问外部类的静态域。

5. 成员内部类不能有 main 方法,但是可以有构造方法。

3.3 成员内部类和外部类的区别和联系
  • private 不可以用在外部类的声明,但是可以用在内部类的声明。

  • 成员内部类的创建需要依赖外部类对象,在没有外部类实例之前无法创建成员内部类对象;
  • 内部类和外部类相对独立;
  • 内部类与外部类可以互相访问彼此的私有域:内部类访问外部类的私有域可以直接访问,外部类访问内部类的私有域必须通过内部类对象访问。

  • 在内部类的内部使用隐藏的外部类变量(与内部类的变量名相同),用外部类类名.this.成员变量。

4. 静态内部类

定义在外部类中的内部使用 static 修饰就是静态内部类。

代码示例:

public class StaticInnerClass {
    int age;
    static int a;

    // 静态内部类
    static class Inner {
        private String name = "lisi";
        static int num = 10;

        public void test() {
            // 访问外部类的静态域
            System.out.println(a);
            System.out.println(name);
            // 不能访问外部类的非静态域
//            System.out.println(age);
        }
    }

    // 成员方法
    public void fun() {
        // 在外部类内部创建静态内部类对象
        Inner inner = new Inner();
        // 通过静态内部类对象访问静态内部类私有域
        System.out.println(inner.name);
    }
}

class Test {
    public static void main(String[] args) {
        StaticInnerClass staticInnerClass = new StaticInnerClass();
        staticInnerClass.fun();
        // 在外部类外部创建静态内部类
        StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
        inner.test();
    }
}                                       

1. 静态内部类不能访问外部类的成员域,可以访问外部类的静态域。

 

2. 静态内部类有自己的成员域。 

3. 在外部类的外部创建静态内部类的语法:外部类名称.Inner = new 外部类.Inner();

成员内部类和静态内部类的区别:

1. 成员内部类必须有外部类对象;静态内部类不依赖外部对象.

2. 成员内部类能访问外部的静态域,不能拥有静态域;静态内部类能拥有成员域,也能拥有静态域,但是不能访问外部的成员域。

5. 方法内部类

定义在方法内部的称为方法内部类(又称局部内部类)。

代码示例:

package demo.inner;


public class MethodInner {
    // 方法
    public void test() {
         final int a = 4;
        // 方法内部类
        class inner {
            int b = 10;

            private void func() {
                // 调用方法内部类外部方法的局部参数
                System.out.println(a);
                // 调用方法内部类中的变量
                System.out.println(b);
            }
        }

        // 使用内部类调用内部类方法
        new inner().func();
    }
}

class test {
    public static void main(String[] args) {
        MethodInner methodInner = new MethodInner();
        methodInner.test();
    }
}

用法:

1. 方法内部类对外部完全隐藏,方法内部类的地位和方法里面的局部变量相似,因此方法内部类不能有任何访问修饰符。

2. 方法内部类只能在声明的方法里面是可见的,请记住,一定要先声明方法,后使用内部类,否则,编译器就会说找不到这个内部类。

3. 方法内部类不能访问其他地方定义的局部变量(就是方法内部类外的地方),除非这个变量是 final 修饰的。

4. 方法内部类只能包含非静态成员。

6. 匿名内部类

匿名内部类也是定义在方法中,没有类名,常用在多线程部分。

要求:

  • 必须继承一个抽象类或者实现一个接口;
  • 没有构造方法。

代码示例:

package demo.inner;

// 接口
interface IMessage {
    void func();
}

// 外部类
public class NoNameInner {
    public static void main(String[] args) {

        // 实现接口
        IMessage msg = new IMessage() {

            // 匿名内部类
            @Override
            public void func() {
                System.out.println("匿名内部类");
            }
        };
        // 使用接口对象调用匿名内部类
        msg.func();
    }
}

ps :匿名内部类只能使用一次就销毁了。

暑期编程PK赛 得CSDN机械键盘等精美礼品!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1017097.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号