1.3局部内部类🐻❄️
局部内部类是在方法中定义的类,所以外界是无法直接使用的,需要在方法中创建对象并使用
该类可以使直接访问外部类的成员,也可以访问方法内的局部变量
代码示例:
public class Outer { private int num = 10; public void method(){ class Inner{ int num1= 30; public void show(){ System.out.println(num); System.out.println(num1); } } Inner i = new Inner(); i.show(); } }
/* 测试类 */ public class OuterDemo { public static void main(String[] args) { Outer o = new Outer(); o.method(); } }
控制台输出:10 30
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
局部内部类:定义在方法中的内部类
不能使用一些修饰符public private…
局部内部类只能定义在方法当中使用
局部内部类当中是不能包含静态变量
因为局部内部类是‘属于方法的’,而static是‘属于类的’,两者相矛盾
局部内部类当中可以包含局部变量,使用的局部变量的本质是final变量
在方法中new出局部类,会在堆中开辟空间,若局部内部类使用了栈中该方法栈帧的成员变量,一旦方法栈帧出栈,堆中的成员变量就无法找到指向的元素,会空指针异常
为了避免这种情况,只能将方法中的成员变量设为static或final,但是static又不能设,所以只能设置为final
当堆中一个对象没有人引用 它并不是直接就销毁
1.4匿名内部类🐇
前提:存在一个类或者接口,这里的了类可以是具体类也可以是抽象类
格式:
new 类名或接口名(){
重写方法;
};
范例:
new Inter(){ //new-》对象没有名字,且继承或者实现了该接口的子类的匿名对象 public void show() { } }
本质: 是一个继承了该类或者实现了该接口的子类的匿名对象
代码示例:
Outer类:
public class Outer { public void method(){ /* new Inter(){ @Override public void show() { System.out.println("匿名内部类"); } };*/ //对象 /* new Inter(){ @Override public void show() { System.out.println("匿名内部类"); } }.show();*/ // 对象调方法 Inter i = new Inter(){ @Override public void show() { System.out.println("匿名内部类"); } }; i.show(); } }
测试类: OuterDemo
public class OuterDemo { public static void main(String[] args) { Outer o = new Outer(); o.method(); } }
接口类:Inter
1.5匿名内部类在开发中的使用🐧
代码示例:
测试类:JumppingDemo /* 测试类 */ public class JumppingDemo { public static void main(String[] args) { //需求:创建接口操作类对象,调用method方法 JumppingOperator jo = new JumppingOperator(); // Jumpping j = new Jumpping();//不能实例化 Jumpping j = new Cat(); jo.method(j); System.out.println("----------------"); jo.method(new Jumpping() { @Override public void jump() { System.out.println("猫可以跳高了"); } });//注意 jo.method(new Jumpping(){ @Override public void jump() { System.out.println("你在狗叫什么"); } }); } }
操作类:
/* 跳高接口操作类,里面有一个方法,方法的参数是接口名 */ public class JumppingOperator { public void method(Jumpping j){//new Cat(); j.jump(); } }
猫类,实例化:
public class Cat implements Jumpping{ @Override public void jump() { System.out.println("猫可以跳高了"); } }
跳高接口
/* 跳高接口 */ public interface Jumpping { void jump(); }
嵌套类有两种类型:🐯
要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。
嵌套类有两种类型:
非静态内部类
静态内部类
静态内部类🦕
静态内部类是 在内部类前面加上static
静态内部类是 不需要创建外部对象
Outter.Inner in = new Outter.Inner();
在静态内部类当中, 没有外部类引用
意思是他在堆中开辟的空间 里面没有存放外部类的地址
静态内部类,是可以访问外部类的静态成员
但是不能直接访问外部类中的非静态成员变量
如果想要访问外部类中的非静态成员变量 可以new一个外部类出来:
new Outer().age
访问静态内部类当中的静态成员:
Outter.Inner.color
不需要new内部类,直接把内部类当对象用
静态内部类当中不仅可以定义静态成员也可以定义非静态成员
调用方法如出一辙
非静态内部类🦖
非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。
由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。