Java内部类

tech2025-01-30  17

Java内部类

刚学的知识,能力有限,暂时整理出这么多,简单的了解和使用

Java内部类内部类的基本使用成员内部类局部内部类匿名内部类静态内部类

内部类的基本使用

概念:

​ 内部类就是在一个类中定义一个类,

格式:

public class 类名{ public class 内部类名{ } }

内部类的访问:

内部类可以直接访问外部类的成员,包括私有属性、方法外部类需要创建内部类对象,才能访问

成员内部类

成员内部类就是作为外部类的成员,也是最常见的内部类

可以直接使用外部类的所有成员和方法,即使是private当内部类的成员属性或者方法也外部类同名时,会发生隐藏现象 直接调用同名属性或方法,使用的是内部类中的使用 “ 外部类.this.成员变量/成员方法 ”才会使用外部的同名属性或者方法 成员内部类属于外部类的成员,如果想要访问成员内部类,需要先创建外部类可以使用访问修饰符(public、protected、private都可以)

举例:

public class Test1 { public static void main(String[] args) { //先创建一个外部类对象 然后创建内部类对象 Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); //也可以这样 Outer.Inner inner1 = new Outer().new Inner(); inner1.show(); } } class Outer{ private int num =10; public class Inner{ public void show(){ //直接使用外部类的num变量 System.out.println(num); method();//调用的是内部类中的method方法 Outer.this.method();//调用的是外部类中的method方法 } public void method(){ System.out.println("内部类中的方法"); } } public void method(){ System.out.println("外部类中的方法"); Inner i = new Inner(); i.show(); } }

局部内部类

就是在方法中定义的类,就叫做局部内部类

局部内部类只能在方法的作用域内使用,它所在的方法外无法使用局部内部类的实例化也要在方法中进行。该类可以直接访问外部类的成员,也可以访问方法内的局部变量局部内部类不能使用访问修饰符

举例:

class Outer{ private int num1 =999; public void method(){ int num2 = 10; class Inner{ public void show(){ //可以访问外部类的属性 System.out.println(num1); //也可以访问方法中的变量 System.out.println(num2); } } //局部变量的实例化也要在方法中 Inner inner = new Inner(); inner.show(); } }

匿名内部类

匿名内部类是不能有名称的内部类,所以没有办法引用,必须在创建时,作为new语句的一部分来声明。

匿名内部类不能有构造方法匿名内部类不能定义任何静态成员、方法和类只能创建匿名内部类的一个实例一个匿名内部类定义时一定在new后面,生成一个对象引用匿名内部类可以实现一个接口或者实现一个抽象类匿名内部类属于局部内部类,所以局部内部类的所有限制都对其有效内部类当中的this指的时匿名内部类本身,如果使用外部类中this则使用“外部类.this”匿名内部类不能使用访问修饰符和static关键字

举例:

//创建一个抽象类 abstract class Abs{ public abstract void absTest(); public abstract void method(); } //创建一个接口 interface Inter01{ public void interTest(); } public class Test5 { public static void main(String[] args) { //创建接口的匿名内部类 new Inter01() { @Override public void interTest() { System.out.println("匿名内部类实现接口的方法"); } }.interTest();//直接调用匿名内部类的方法 Test5 test5 = new Test5(); //当这个方法需要一个接口的对象作为参数时,就可以定义一个匿名内部类传给方法 test5.display(new Inter01() { @Override public void interTest() { System.out.println(); } }); } public void display(Inter01 inter01){ //调用接口中的方法 inter01.interTest(); } //当一个方法需要一个抽象类的返回值,匿名内部类也可以作为返回值 public Abs returnTest(){ return new Abs() { @Override public void absTest() { } @Override public void method() { } }; } //创建一个和抽象类中重名的方法 public void method(){ System.out.println("和抽象类中方法重名的方法"); } //创建一个方法 测试匿名内部类中this的使用 public void thisTest(){ //创建抽象类的匿名内部类 new Abs() { @Override public void absTest() { System.out.println("匿名内部类实现抽象类的方法"); //这两个调用的是匿名内部类中的method方法 method(); this.method(); //这种写法调用的是外部类中的method方法 Test5.this.method(); } @Override public void method() { System.out.println("匿名内部类中的一个普通方法"); } }.absTest(); } }

静态内部类

使用static修饰的成员内部类

静态内部类不需要依赖于外部类的存在静态内部类不能使用外部类中非静态的成员变量或方法 public class Test3 { public static void main(String[] args) { //可以直接访问内部类中的静态属性和方法,不依赖于外部类 System.out.println(Outer.Inner.str); } } class Outer{ static int num =100; static class Inner{ static String str = "静态变量"; public void method(){ //只能访问外部类中的静态变量和方法 System.out.println(num); } } }
最新回复(0)