内部类
内部类
1. 什么是内部类?
内部类就是在一个类的内部(类的里面)在定义一个类。在A类中定义一个B类,那么B类就是A类的内部类,A类就是B类的内部类。
2. 内部类分类
- 成员内部类
public class Inner{} / class Inner{}
- 静态内部类 加了
static
,public static class Inner{} / static class Inner{}
- 局部内部类
- 匿名内部类
3 详解各个内部类
3.1 成员内部类
1.创建一个外部类Outer,在类Outer里面定义一个内部类Inner
2.在Application启动类中调用外部类,内部类的属性和方法。
//外部类Outer
public class Outer {
private int id1 = 10; //外部类私有属性
int id2 = 11; //外部类公有属性
//外部类私有方法
private void out1() {
System.out.println("这是外部类的私有方法");
}
//外部类公有方法
public void out2() {
System.out.println("这是外部类的公有方法");
}
//成员内部类Inner
class Inner {
//内部类公有方法
public void in() {
System.out.println("这是内部类的公有方法");
}
//内部类可以获得外部类的私有属性和私有方法!(公有的更能!)正常类是做不到的。
public void getID() {
System.out.println(id1);
System.out.println(id2);
}
public void getMethod() {
out1();
out2();
}
}
}
//启动类Application
public class Application {
public static void main(String[] args) {
//首先实例化外部类,new一个外部类对象
Outer outer = new Outer();
//通过外部类对象来实例化内部类
Outer.Inner inner = outer.new Inner();
inner.in();//内部类调用自己的内部类方法
inner.getID();//内部类对象获取外部类私有属性和公有属性
inner.getMethod();//内部类对象获取外部类私有方法和公有方法!
}
}
3.2 静态内部类
1.创建一个外部类Outer2,在类Outer2里面定义一个内部类Inner2
2.创建Application2
//外部类Outer2
public class Outer2 {
private static int id1 = 10;
static int id2 = 11;
private static void out1() {
System.out.println("这是外部类的私有方法");
}
public static void out2() {
System.out.println("这是外部类的公有方法");
}
//内部类+static(静态内部类)
//外部类的没加static的私有、公有属性和方法拿不到了。静态内部类没办法访问非静态属性!
/*原因:实例化外部类后,static静态内部类也随之加载了,而外部类的非静态属性方法还都没出生呢,所有拿不到*/
//要想拿到,只能是外部类的私有、公有属性和方法也要加static
public static class Inner2 {
public void in() {
System.out.println("这是内部类的公有方法");
}
public void getID() {
System.out.println(id1);
System.out.println(id2);
}
public void getOUT() {
out1();
out2();
}
}
}
public class Application2 {
public static void main(String[] args) {
Outer2 outer2 = new Outer2();
}
}
3.3 局部内部类
1.创建一个外部类Outer3,在类Outer3里面定义一个方法,在这个方法里面创建局部内部类
//在外部类方法里面定义的类是局部内部类
public class Outer3 {
public void method(){
//局部内部类
class Inner{}
}
}
3.4 匿名内部类
没有名字初始化类,不用将实例保存到变量中
public class Outer4 {
public static void main(){
//正常调用
//将实例保存到变量中了
Apple apple = new Apple();
apple.eat();
//匿名内部类
//没有名字初始化类,不用将实例保存到变量中
new Apple().eat();
//new接 口 也不需要名字 也是匿名
UserService userService= new UserService(){
@Override
public void Hello(){
}
};
}
}
//类Apple
class Apple{
public void eat(){
System.out.println("1");
}
}
//接口
interface UserService{
void Hello();
}
4 总结各个内部类
//成员内部类
1.成员内部类可以获得其外部类的私有属性和私有方法!(外部类公有的更能获得!),正常类是做不到的。
//静态内部类
1.内部类+static(静态内部类)
2.外部类的没加static的私有、公有属性和方法拿不到了,静态内部类没办法访问非静态属性!
原因:实例化外部类后,static静态内部类也随之加载了,而外部类的非静态属性方法还都没出生呢,所有拿不到。
要想拿到,只能是外部类的私有、公有属性和方法也要加static
//局部内部类
1.在外部类的方法里面定义的类是局部内部类
//匿名内部类
1.没有名字初始化类,不用将实例保存到变量中 new Apple().eat();