JAVA内部类详解

简介: JAVA内部类详解

一,内部类

✅1.内部类的概念

🌸==内部类是定义在类中的类。==

🍁内部类把逻辑上相关的类放在一起。而有的内部类不会在其他地方用到,它没有类名,在定义的时候就生成一个该类的实例,称为匿名内部类。匿名内部类是一种特殊的内部类。


  • 🍁当然啦!可以把内部类看作外部类的一个成员,它拥有自己的成员变量和成员方法。通过实例化对象可以访问其成员变量或调用成员方法。

✅2.内部类的定义

🌸==把类的定义放在一个用于封装它的类的内部。==

  • 🍁内部类不能与外部类同名。
  • 🍁在封装它的类内部使用内部类与普通类相同,在外部使用要在内部类前加上它所属的外部类的名字。在用new创建内部类时也要在new前加上对象变量。

✅3.内部类与外部类的访问规则

  • 🍁在外部类中,通过一个内部类对象引用内部类中的成员,同样啦!在内部类中也可以直接引用它的外部类的成员,内部类也可以通过创建对象从外部类之外被调用,但必须在内部声明为public。


    原理:
  • 在内部类对象中保存了一个对外部类对象的引用,当在内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义这个变量,调用就会被传递给内部类保存的那个对外部类的引用,通过这个外部类对象的引用去调用这个变量。🍁

//filename:Group.java
public class Group{
    private int age;
    public class Student{
        String name;
        public Student(String n,int a){
            name=n;
            age=a;
        }
        public void show(){
            System.out.print("姓名:"+this.name+"年龄:"+age);
        }
    }
    public void show(){
        Student stu=new Student("张三 ",18);
        stu.show();
    }
    public static void main(String[] args){
        Group g=new Group();
        g.show();
    }
}
//姓名:张三 年龄:18

  • 🍁在内部内调用外部类的方法也是同样的原理。
  • 🍁内部内编译完成后,产生的文件名为:外部类名$内部类名.class。

✅4.内部类的注意事项

  1. 🍁内部类定义为抽象类,需要有其它内部类来继承或者实现。
  2. 🍁内部类可以声明为protected,private。
  3. 🍁内部类不能与包含它的外部类名相同。
  4. 🍁内部类既可以使用外部类的成员变量,也可以使用内部类所在方法的局部变量。
  5. 🍁内部类不光可以在类中定义,也可以在程序块之中定义。比如在方法中定义内部类,但是只能访问方法中final类型的局部变量。
  6. 🍁内部类可以声明为static,静态内部类自动转换为顶层类,即它没有父类,而且不能引用外部类成员或其他内部类中的成员,非静态内部类不能声明静态成员,只有静态内部类才能声明静态成员。

🌕二,匿名内部类

🌸==是指可以利用内部类创建没有名字的内部类,进一步声明内部类和创建一个该类的对象。==

  • 🍁创建匿名类的用意是:补充内部类中没有定义到的方法。
  • 🍁匿名内部类直接使用父类的名字或者实现接口的名字。
  • 🍁匿名类的定义和实例化对象同时进行。
  • 🍁匿名内部类没有名字,所以它的前面不能有访问权限修饰符,也没有构造方法。因为默认构造方法没有参数,所以创建对象时不能带参数。

✨使用方法:

//filename:A_1.java
public class A_1{
    public static void main(String[] args){
        (
                new Inner(){
                    void setName(String n){
                        name=n;
                        System.out.print("姓名:"+name);
                    }
                }
                ).setName("张 三");
    }
    static class Inner{
        String name;
    }
}
//姓名:张 三

✨思路:

  • 🍁在上面例子中创建一个匿名内部类对象,但却没有名称,所以叫做“匿名内部类”。
  • 🍁匿名内部类编译完成后,所产生的文件名:外部类类名$编号.class。编号为1,2,3…,代表第几个匿名内部类。

相关文章
|
1月前
|
Java
java中,剩下的这两个内部类不太好理解!
java中,剩下的这两个内部类不太好理解!
12 0
|
1月前
|
Java 编译器
java中常见的几种内部类,你会几个?(未完)
java中常见的几种内部类,你会几个?(未完)
14 1
|
4月前
|
Java 数据安全/隐私保护
【零基础学Java】—内部类的概念与分类(三十)
【零基础学Java】—内部类的概念与分类(三十)
|
13天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
35 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
15天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
9 0
|
15天前
|
存储 Java
java接口和内部类
java接口和内部类
|
1月前
|
Java 编译器
详解java各种内部类
详解java各种内部类
|
1月前
|
设计模式 Java
JAVA内部类
JAVA内部类
10 1
|
2月前
|
Java
JAVA基础--内部类和静态内部类、单例模式---静态内部类剖析
JAVA--内部类和静态内部类、单例模式---静态内部类剖析
38 9
|
4月前
|
Java
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
40 0