一、什么是内部类
类中可以有变量和方法,那么我们在类中再添加一个元素类。将一个类声明/定义在另一个类的里面,里面的这个类就是--内部类是类里面的类。
注:内部类编译后会形成一个新的字节码文件【外部类类名$内部类类名.class】
二、内部类的分类
可以分为四类:
1.成员内部类
2.方法内部类
3.静态嵌套类
4.匿名内部类
三、成员内部类
1.成员内部类中可以用什么修饰
成员内部类可以用任意修饰符修饰
//基本结构:
public class TestClass {
public class InnerClass{
}
}
2.成员内部类中可以有什么元素
成员内部类中可以有实例元素(变量、方法)、构造方法
3.成员内部类元素间的调用
i.成员内部类的构造方法和实例方法
可以访问当前内部类的构造方法 ---- 用 new 构造方法( )
可以访问当前内部类的实例元素 ---- 用 对象/this. 都可以省略
ii.成员内部类的构造方法和实例方法
可以访问外部类的构造方法 ---- 用 new 外部类的构造方法( )
可以访问外部类的实例元素 ---- 用 对象/外部类名.this. 都可以省略
可以访问外部类的静态元素 ---- 用 类名/对象/外部类名.this. 都可以省略
iii.外部类的构造方法和实例方法
可以访问成员内部类的构造方法 ---- 用 new 内部类的构造方法( )
可以访问成员内部类的实例元素 ---- 只能用对象访问
外部类的静态方法
不能访问成员内部类的构造方法
不能访问成员内部类的实例元素
iv.其他类的构造方法、实例方法、静态方法访问成员内部类的元素
可以访问成员内部类的构造方法 ---- 外部类对象.new.内部类的构造方法( )
可以访问内部类的实例元素 ---- 只能通过对象访问
二、方法内部类
1.方法内部类是定义在方法中的类,相当于一个局部变量,所以方法内部类不能有修饰符
//基本格式:
public class TestClass {
public TestClass(){
class InnerClass1{
}
}
public void testMethod(String canshu){
class InnerClass2{
}
}
public static void testStaticMethod(String canshu){
class InnerClass3{
}
}
}
2.方法内部类中可以有什么元素
方法内部类中可以有实例元素(变量、方法)、构造方法
3.方法内部类中元素的调用
i.方法内部类的构造方法和实例方法
可以访问当前内部类的构造方法 ---- 用 new 内部类的构造方法( )
可以访问当前内部类的实例元素 ---- 用 对象/this. 都可以省略
ii.方法内部类中访问当前方法中的局部变量【变量名称】
注意该局部变量是final修饰符修饰
iii.方法内部类的构造方法和实例方法
可以访问外部类的构造方法 ---- 用 new 外部类的构造方法( )
可以访问外部类的实例元素 ---- 用 对象/外部类名.this. 都可以省略
可以访问外部类的静态元素 ---- 用 类名/对象/外部类名.this. 都可以省略
iv.其他类不能访问方法内部类的元素
三、静态嵌套类
1.相当于是java类中的静态变量,可以使用任意修饰符修饰
//基本格式:
public class TestClass {
public static class InnerClass{
}
}
2. 静态嵌套类中可以有什么元素
可以有有构造方法,实例元素,静态元素
3.静态嵌套类的元素调用
i.静态嵌套类的构造方法和实例方法
可以访问当前内部类的构造方法 ---- 用 new 内部类的构造方法( )
可以访问当前内部类的实例元素 ---- 用 对象/this. 都可以省略
可以访问当前内部类的静态元素 ---- 用 类名/对象/this. 都可以省略
静态嵌套类的静态方法
可以访问当前内部类的构造方法 ---- 用 new 内部类的构造方法( )
可以访问当前内部类的实例元素 ---- 用 对象 访问
可以访问当前内部类的静态元素 ---- 用 类名/对象 都可以省略
ii.静态嵌套类的构造方法、实例方法、静态方法
可以访问外部类的构造方法 ---- 用 new 外部类的构造方法( )
可以访问外部类的实例元素 ---- 只能用对象访问
可以访问外部类的静态元素 ---- 用 类名/对象 都可以省略
iii.外部类的构造方法、实例方法、静态方法
可以访问静态嵌套类的构造方法 ---- 用 new 外部类名.静态嵌套类的构造方法( )
可以访问静态嵌套类的实例元素 ---- 只能用对象访问
可以访问静态嵌套类的静态元素 ---- 用 类名(从外部类类名开始.)/对象 可省略
四、匿名内部类
没有名字的java类,在不用创建出新类的情况下,构建出当前类/接口的子类,构建的子类没有名字
public class Person {
public void personInfo(){
System.out.println("Person类的实例方法");
}
}
public class Main {
public static void main(String[] args) {
Person per=new Person(){
public void personInfo(){
System.out.println("重写Person类的personInfo方法");
}
};
per.personInfo();
}
}
/*
new Person(){
public void personInfo(){
System.out.println("重写Person类的personInfo方法");
}
}
上面的代码就是一个匿名内部类的格式,就相当于Person类的子类,只是没有名字,所以叫匿名内部类
*/
抽象类和接口中使用匿名内部类
//定义一个People抽象类
public abstract class People {
//定义一个抽象方法
abstract void run();
}
//定义一个学生接口
public interface Student {
//定义一个抽象方法
void learn();
}
//主方法
public class TestMain {
public static void main(String[] args) {
//构建子类对象
People people = new People() {
@Override
void run() {
System.out.println("我是人,我可以跑");
}
};
people.run();
//构建接口子类对象
Student student = new Student() {
@Override
public void learn() {
System.out.println("我是学生,我会学习");
}
};
student.learn();
}
}
/*
结果是
我是人,我可以跑
我是学生,我会学习
*/