Java 内部类

本文详细介绍了Java中的四种内部类:静态内部类、实例内部类、局部内部类和匿名内部类。静态内部类可以直接通过类名实例化,而实例内部类需要依托外部类实例。局部内部类仅在其定义的方法内有效,匿名内部类通常用于快速实现接口或父类的简单功能。每种内部类都有其特定的使用场景和限制,如静态内部类不能直接访问外部类的非静态成员,实例内部类可以。理解这些概念有助于提升Java编程能力。
摘要由CSDN通过智能技术生成

一 . 内部类分类:

1.静态内部类

2.非静态内部类/实例内部类

3.局部内部类

4.匿名内部类

1.静态内部类 :   Student类是一个静态内部类

class Person {
    
    // 静态内部类
    static class Student {
     
    } 

}

如何去实例化一个内部类对象 : 

通过类名Person.  配合内部类类名   (就跟类名.静态成员变量一样)

public class Test {
    public static void main(String[] args) {
        Person.Student student = new Person.Student();
    }
}

在静态内部类下  需要注意一下它们成员变量直接的使用 : 

可以看到在静态类内部 是不能使用data1 和 data2 的.

 不论是静态方法还是静态类 : 它们都是不依赖于对象的,所以在它们的内部都是不可以直接使用非静态成员方法/非静态成员变量.

是不可以直接使用,但是我们可以在静态类的方法内部去实例化一个Person对象,然后通过引用去调用成员变量.

class Person {
    public int data1;
    private int data2;
    public static int data3;
     static class Student {
        public int data4;
        private int data5;
        public static int data6;
        public void fun () {
            Person person = new Person();
            System.out.println(person.data1);
            System.out.println(person.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
}

在Person类内部的类 要是想要使用Student类内部的成员变量/成员方法就要去实例化Student对象.

class Person {
    public int data1;
    private int data2;
    public static int data3;
     static class Student {
        public int data4;
        private int data5;
        public static int data6;
        public void fun () {
            Person person = new Person();
            System.out.println(person.data1);
            System.out.println(person.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
    public void print() {
        Student student = new Student();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        System.out.println(student.data4);
        System.out.println(student.data5);
        //调用静态类内部的静态成员变量时,直接通过Student类名去调用就可以了
        System.out.println(Student.data6);
    }
}

2. 非静态内部类 / 实例内部类 : 

class Person {
    //实例内部类 / 非静态内部类
    class Student {
       
    }

}

如何实例化一个实例内部类对象 : 

首先我们先实例化一个Person对象

然后通过Person类名 . 实例化内部类类名  引用变量 = person(实例化Person的引用) 去new 一个静态内部类对象.

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        Person.Student student = person.new Student();
    }
}

在实例内部类中 是不可以定义静态成员变量的.因为静态成员变量是不依赖对象的. 可以把实例内部类当做是Person类的一个非静态方法. 那么在方法内中存储的都是局部变量,局部变量是存储在栈上面的. 而Java中规定静态变量是定义在类中方法外面,静态变量是存储在方法区的.

局部变量出了方法就被栈回收了,而静态变量不会,所以在局部变量前不能加static关键字

 

在实例内部类中不可以定义静态变量,但是可以定义常量.

实例化内部类中成员变量之间的调用 跟 静态内部类   其实大同小异 : 

class Person {
    public int data1;
    private int data2;
    public static int data3;
    class Student {
        public int data4;
        private int data5;
        public void fun () {
            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
        }
    }
    public void print() {
        Student student = new Student();
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
        System.out.println(student.data4);
        System.out.println(student.data5);
    }
}

3.局部内部类(了解即可)

它就是定义在Person类的fun方法的内部.

局部内部类 : 定义在类中方法的内部

class Person {
    public void fun () {
        //局部内部类 
        class Student {

        }
    }
}

局部内部类有很大的缺点,它的使用范围只能是在它在的那个方法内部.

大家了解一下即可.(平常几乎不会这样写)

class Person {
    public int data1 = 100;
    private int data2 = 200;
    public static int data3 = 300;

    public void fun () {
        class Student {
            public int c = 100;
            //可以使用Person类的全部成员变量
            public void print () {
                System.out.println(data1);
                System.out.println(data2);
                System.out.println(data3);
            }
        }
        Student student = new Student();
        student.print();
    }
}

4.匿名内部类

interface A {
    void fun();
}

public class Test {
    public static void main(String[] args) {
        new A() {
            @Override
            public void fun() {
                System.out.println("匿名内部类");
            }
        }.fun();
    }
}

在main方法中  new 一个接口 后面加一个花括号 里面就要去重写一下接口的抽象方法;

要是使用里面的方法,在花括号的外面 加上  .  然后去调用重写后的方法.

这是通过普通类实现 :

 

class B {
    public void fun1() {
        System.out.println("fun1()");
    }
}
public class Test {
    public static void main(String[] args) {
        new B() {
            @Override
            public void fun1() {
                System.out.println("匿名内部类");
            }
        }.fun1();
    }
}

运行结果 : 

或者这样 : 

class B {
    public void fun1() {
        System.out.println("fun1()");
    }
}
public class Test {
    public static void main(String[] args) {
        B b = new B() {
            @Override
            public void fun1() {
                System.out.println("匿名内部类");
            }
        };
        b.fun1();
    }
}

 运行结果 : 

 

 希望能帮到大家~~~~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值