Java内部类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/52388689

内部类就是在一个类A的定义内部定义的类B,类B可以跟类A的成员变量/方法同级,也可以定义在类A的方法中,等等。内部类一般包括这四种:成员内部类、静态内部类、局部内部类和匿名内部类。

每个内部类都能独立地实现一个接口或者抽象类,所以无论其所属的主类是否已经实现一个接口或者抽象类,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类采可以实现多重继承的效果。 成员内部类和静态内部类用private/protected/public修饰时,外部访问规则与访问对应外部类的属性/方法的规则一样;局部内部类不能使用访问修饰符修饰;匿名内部类甚至都不用class关键字来定义,下面是这几种内部类的举例说明:

1、成员内部类

public class OuterClass1 {
    private String name = "OuterClass";
    private static int age = 25;

    public static void main(String[] args) {
        OuterClass1 outerClass = new OuterClass1();
        InnerClass innerClass = outerClass.new InnerClass(); //访问成员内部类需要用对应主类的对象进行访问
        innerClass.innerPrint();
    }

    public OuterClass1() {
        System.out.println("OuterClass init……");
    }

    public void print() {
        System.out.println("OuterClass print()");
    }

    protected class InnerClass {
        //private static String name="InnerClass"; //局部内部类不能定义静态变量/方法(Inner classes cannot have static declarations)
        private String name = "InnerClass"; //局部内部类可以定义对应主类属性相同的变量

        public InnerClass() {
            System.out.println("InnerClass init……");
        }

        public void print() {
            System.out.println("InnerClass print()");
        }

        public void innerPrint() {
            System.out.println("name of InnerClass:" + name);  //内部类引用自己的变量
            System.out.println("name of InnerClass:" + this.name);  //内部类引用自己的变量
            System.out.println("name of OuterClass:" + OuterClass1.this.name);  //内部类引用对应主类的同名变量
            System.out.println("age of OuterClass:" + age);  //内部类引用对应主类的变量
            System.out.println("age of OuterClass:" + OuterClass1.age);  //内部类引用对应主类的变量
            print();   //内部类调用自己与主类同名的方法
            OuterClass1.this.print(); //内部类调用对应主类的同名方法
        }
    }
}

(1)成员内部类对象中不能定义静态变量、静态方法

(2)要创建成员内部类对象,必须要先创建对应外部类的对象

(3)成员内部类引用对应主类的同名属性/方法时,格式为:主类名.this.属性名/方法名

2、静态内部类

public class OuterClass {
    private String name = "OuterClass";
    private static int age = 25;

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();//可以直接通过对应主类访问静态内部类
    }

    public OuterClass() {
        System.out.println("OuterClass Init……");
    }

    protected static class InnerClass {
        private static String name = "InnerClass"; //静态内部类可以定义对应主类属性相同的变量;可以定义静态变量
        private static int age = 25;

        public InnerClass() {
            System.out.println("InnerClass Init……");
        }
    }
}

(1)要创建嵌套类的对象,并不需要其外围类的对象。

(2)不能从嵌套类的对象中访问非静态的外围类对象。

3、局部内部类

public class OuterClass {
    private String name = "OuterClass";
    private static int age = 25;

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.addAgeForInnerClass();
    }

    public void addAgeForInnerClass() {
        final int addAge = 1;

        class InnerClass {
            String name = "InnerClass";
            int age = 20;

            public void addAge(int age) {
                this.age += age;
                System.out.println("age of InnerClass:" + this.age);
            }

            public void print() {
                System.out.println("name of InnerClass:" + name);  //内部类引用自己的变量
                System.out.println("name of InnerClass:" + this.name);  //内部类引用自己的变量
                System.out.println("name of OuterClass:" + OuterClass3.this.name);  //内部类引用对应主类的同名变量
                System.out.println("age of InnerClass.addAgeForInnerClass.addAge:" + addAge);//内部类引用所在方法中的变量
            }
        }

        InnerClass innerClass = new InnerClass();
        innerClass.addAge(addAge);
    }
}

(1)局部内部类可以定义在静态代码块、构造代码块、方法中

(2)局部内部类不可以用访问修饰符(private/protected/public)修饰

4、匿名内部类

匿名内部类也是一种局部内部类,不需要用class关键字来声明,匿名内部类通常是一个抽象类或接口的实现(二者只能选择其一),直接通过new关键字来实例化。

public abstract class AbstractClass {
    protected static String name = "Danny";
    protected static int age = 25;
    public abstract void print();
}

public class OuterClass {

    public static void main(String[] args) {
        print(178);
    }

    public static void print(final int height) {
        AbstractClass abstractClass = new AbstractClass() {

            @Override
            public void print() {
                System.out.println(name + "' age is " + age + ",his height is" + height);
            }
        };
        abstractClass.print();
    }
}

(1)匿名内部类中不能定义静态变量/方法 (2)匿名内部类中不能定义构造函数 (3)匿名内部类中引用的外界变量必须为final

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏软件开发 -- 分享 互助 成长

C++静态成员变量和静态成员函数小结

静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成...

21350
来自专栏积累沉淀

程序、进程、线程的关系

创建一个Java线程常见的有两种方式: 1.继承Thread类 两种表示方法: (1).外部类 import java.util.D...

20560
来自专栏wym

Enumeration类 重要的遍历

这是检测Enumeration 对象是否还有元素,有则返回true,否则faluse

22810
来自专栏积累沉淀

线程的创建

创建一个Java线程常见的有两种方式: 1.继承Thread类 两种表示方法: (1).外部类 import java.util.D...

21980
来自专栏流媒体

c++操作符重载

9230
来自专栏浪淘沙

实训day05--静态,继承

2018.06.08 1.private关键字 权限修饰符 修饰类,方法,属性,构造函数 最常用的形式: 把成员变量用pri...

12550
来自专栏行者常至

final、abstract、interface

【包含抽象方法的类一定是抽象类;抽象类中可包括非抽象方法(具体的方法)。抽象类无法实例化,不能创建对象,只能通过子类继承,然后通过方法覆盖。如果不覆盖抽象方法,...

9910
来自专栏java一日一条

常见Java面试题 – 第五部分:equals与==

因此,上面的问题考察了面试者对”==” 和 “equals( )”在Java对象上如何应用的理解是否正确。前者比较引用,后者则比较对象中真正的值。

10210
来自专栏运维技术迷

连仕彤博客[Python笔记] 判断0-9数字在字符串中出现的次数

要求 给定一些数字(0-9范围之间),判断数字在字符串中出现的次数。 例子的排序是依照算法的效率(时间复杂度)从低到高 例子1   # 定义数字 num = ...

42670
来自专栏开发与安全

Java与C/C++不同的一些基础知识点

0. 类与文件 一个 java 文件可以写多个类,每个类里面可以有main函数,一个java文件里面只能有一个 public 类,此时 java 文件的命名只...

20300

扫码关注云+社区

领取腾讯云代金券