内部类
概念
属于类(五大成员:属性、方法、构造方法、代码块、内部类)
在一个类的里面,再定义一个类。
注意:
- 内部类表示的事物是外部类的一部分
- 内部类单独出现没有意义
访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
package Java;
public class Demo1 {
int age = 10;
String name = "Demo1";
public void method1(){
System.out.println(Demo2name);//wrong
System.out.println(d.Demo2name);
}
class Demo2{
String Demo2name = "Demo2";
int Demo2age = 20;
public void method2(){
System.out.println(age);
System.out.println(name);
}
}
}
分类
成员内部类
- 写在成员位置的(类中,方法外),属于外部类的成员
- 可以被一些修饰符所修饰(比如:
private,默认,protected,public,static等等
) - 在成员内部类的里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量
获取成员内部类的对象
- 在外部类中编写方法,对外提供内部类的对象(一般是private修饰时)
public Inner getInstance(){
return new Inner();
}
- 直接创建格式:
外部类名.内部类名 对象名 = 外部类对象名.内部类对象名;
Outer.Inner oi = new Outer().new Inner();
tips:file -> project structure -> project
选择编译的JDK版本
获取外部类的成员变量
class Outer{
private int a = 10;
class Inner{
private int a = 20;
public void show(){
int a = 30;
System.out.println(Outer.this.a);//10
System.out.println(this.a);//20
System.out.println(a);//30
}
}
}
静态内部类
- 只能访问外部类中的静态变量和方法
- 如果要访问非静态的需要创建对象
- 创建对象格式:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
- 调用非静态方法的格式:
先创建对象,用对象调用
- 调用静态方法的格式(不用创建对象):
外部类名.内部类名.方法名();
- 1和2点是JavaBean类里面的4,5是测试类里面的
package Java;
public class Demo1 {
int age = 10;
static int height = 2;
String name = "Demo1";
public void method1(){
Demo2 d = new Demo2();
System.out.println(d.Demo2name);
}
static class Demo2{
String Demo2name = "Demo2";
int Demo2age = 20;
public void method2(){
Demo1 d = new Demo1();
System.out.println(d.age);
System.out.println(d.name);
System.out.println(height);
}
static public void method3(){
System.out.println(height);
}
}
}
package Java;
public class TextDemo1 {
public static void main(String[] args) {
Demo1.Demo2 d = new Demo1.Demo2();
d.method2();
Demo1.Demo2.method3();
}
}
局部内部类
概念
- 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
- 外界是无法直接使用,需要在方法内部创建对象并使用
- 该类可以直接访问外部类对象的成员,也可以访问方法内的局部变量
- 不能被
public protected private 默认
修饰(此特点是局部变量的特点)
匿名内部类
概念
隐藏了名字的内部类
格式
//继承\实现
//方法重写
//创建对象
//整体就是一个类的子类对象或者接口的实现类对象
new 类名或接口名(){
重写方法;
};
//这个对象,可以调用自己类中的所有方法
//类名或接口名 对象名 = new 类名或接口名(省略) 实现接口或类的多态
- 匿名内部类可以写在成员位置,也可以写在局部位置
- 使用场景:当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只用一次,就可以用匿名内部类简化代码