一 . 内部类分类:
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();
}
}
运行结果 :
希望能帮到大家~~~~~~~~