内部类的介绍和分类、静态内部类、非静态内部类、局部内部类、匿名内部类、静态非静态内部类面试题

内部类的介绍分类

1、内部类:
当一个类的内部,任然有一个完整的结构,这个完整的结构任然需要一个类进行描述,因为有自己的特征(属性,方法)
并且这个内部类是为外部类服务的。

内部类:在集合中最多

身体(Body)里面有各种的器官,例如:心脏,也是一个独立的结构,也需要一个类描述
而且这个心脏是为Body服务的,离开Body就没有意义了。

2、分类

(一)成员内部类
和成员变量一样,在类中,方法外
1、静态成员内部类:简称静态内部类
2、非静态成员内部类:简称成员内部类

(二)局部内部类
在方法类
1、有名字的局部内部类:简称局部内部类(最少)
2、没名字的局部内部类:简称匿名内部类

静态内部类

一、静态内部类
1、如何声明?
【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{

				 	【修饰符】 **static** class 内部类 【extends 父类】 【implemends 父接口们】{
				 	
				 	}	
				 }

说明:静态内部类的修饰符
(1)权限修饰符:4个
(2)static必须有
(3)abstract可以有
(4)final可以有

2、成员
类的五大成员都可以
(1)属性:静态的 非静态的都可以
(2)方法:静态的 非静态的都可以
在抽象的静态内部类中,还可以有抽象方法
(3)代码块:静态的和非静态
(4)构造器:无参,有参
(5)内部类,语法上可以,但是太复杂了,不这么写

3、使用
(1)在静态内部类中不予许使用外部类的非静态的成员
(2)在外部类中使用静态内部类和使用其他的类一样
(3)在外部类的外面使用静态内部类,不需要外部类的对象
Outer.Inner
(4)在外部类的外面要调用静态内部类的非静态方法,需要静态内部类的对象
例如:Outer.Inner obj = new Outer.Inner();
obj.test();
(5)在外部类的外面要调用静态内部类的静态方法,不需要静态内部类的对象
例如:Outer.Inner.method();

4、说明:
静态内部类也有自己的字节码文件
外部类$静态内部类.class

非静态内部类

一、非静态内部类
1、如何声明?
【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{

				 	【修饰符】 class 内部类 【extends 父类】 【implemends 父接口们】{
				 	
				 	}	
				 }

说明:非静态内部类的修饰符
(1)权限修饰符:4个
(2)static没有
(3)abstract可以有
(4)final可以有

2、成员
类的五大成员都可以,但是不予许有静态成员
(1)属性:非静态的都可以
(2)方法:非静态的都可以
在抽象的内部类中,还可以有抽象方法
(3)代码块:非静态
(4)构造器:无参,有参
(5)内部类,语法上可以,但是太复杂了,不这么写

3、使用
(1)在非静态的内部类中可以使用外部类的所有成员
(2)在外部类中,使用非静态内部类有限制
在外部类的静态方法中不予许使用非静态的内部类
(3)在外部类的外面使用非静态内部类,声明变量和静态内部类一样
Outer.Inner in;
(4)在外部类的外面要调用非静态内部类的非静态方法,需要外部类的对象和内部类的对象
例如:Outer out = new Outer();
Outer.Inner in = out.new Inner();
in.test();

因为“对象.new 内部类”太怪异了,然后实际编写时,不这样写
Outer.Inner in2 = out.getInner();//方法的作用:为外界提供内部类的对象
in.test();

//如果想要简化Outer.Inner的写法
//可以使用导包语句:import 包.Outer.Inner;
Inner in3 = out.getInner();
in3.test();

4、说明:
非静态内部类也有自己的字节码文件
外部类$非静态内部类.class

面试题

考点:
(1)子类继承抽象类,需要重写抽象的抽象方法
(2)要使用非静态的内部类,需要外部类的对象
(3)子类继承父类时,在子类的构造器中,必须调用父类的构造器

public class TestMianShi1 {

}

class Outer{
	abstract class Inner{
		public abstract void test();
	}
}

/*
 考点:
 	(1)子类继承抽象类,需要重写抽象的抽象方法
 	(2)要使用非静态的内部类,需要外部类的对象
 	(3)子类继承父类时,在子类的构造器中,必须调用父类的构造器
 */
class MyInner extends Outer.Inner{
	
	//这个是重点
	MyInner(Outer out){
		out.super();
	}
	
	public void test() {
		System.out.println("...");
	}
}

局部内部类和静态内部类在下一篇文章中:
https://blog.csdn.net/qq_41005604/article/details/107069972

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值