内部类
什么是内部类?
内部类,顾名思义就是定义在另一个类之内的类。
内部类有什么好处?(官方说法。编程实践太少了,没有形成自己的认知,以后有体会,回来再根据自己认知改一改!)
-
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
-
内部类的方法可以直接访问外部类的所有数据,包括私有的数据
-
内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
内部类分几种呢?
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
话不多说,先来看一段代码熟悉一下:
//外部类HelloWorld
public class HelloWorld {
// 内部类Inner,类Inner在类HelloWorld的内部
public class Inner {
// 内部类的方法
public void show() {
System.out.println("welcome to github!");
}
}
public static void main(String[] args) {
// 创建外部类对象
HelloWorld hello = new HelloWorld();
// 创建内部类对象,必须是 内部类 对象名 = 外部类对象.new 内部类();
Inner in = hello.new Inner();
// 调用内部类对象的方法
in.show();
}
}
运行结果:
welcome to github!
成员内部类
什么是成员内部类? 最常见的就是成员内部类,相当于类内部的成员变量,成员方法一个等级,就是一个普通的内部类而已。
看段代码:
//外部类HelloWorld
public class Outter{
//外部类的私有属性name
private String name = "sober";
//外部类的成员属性
int age = 22;
//成员内部类Inner
public class Inner {
String name = "mrz";
//内部类中的方法
public void show() {
System.out.println("外部类中的name:" + Outter.this.name);//当内部类和外部类成员变量名一样时,要访问外部类的成员,格式必须是外部类.this.变量名
System.out.println("内部类中的name:" + name);
System.out.println("外部类中的age:" + age);
}
}
//测试成员内部类
public static void main(String[] args) {
//创建外部类的对象
Outter o = new Outter ();
//创建内部类的对象
Inner inn = o.new Inner();
//调用内部类对象的show方法
inn.show();
}
}
运行结果: 外部类中的name:sober 内部类中的name:mrz 外部类中的age:22 小总结:
- 可以看到,内部类Inner就是简单的放在了外部类Outter里面
- Innter的show方法,可以任意访问外部类的所有成员变量,不论修饰符是public还是private
- Inner的show方法可以直接访问Outter的私有成员变量,
- 当内部类和外部类成员变量名一样时,要访问外部类的成员,格式必须是外部类.this.变量名
注意:外部类不能直接使用内部类的成员和方法,但内部类可以访问外部类的成员和方法
静态内部类
什么是静态内部类?
静态内部类是由static修饰的内部类。
看段代码:
//外部类
public class HelloWorld {
// 外部类中的静态变量score
private static int score = 84;
// 创建静态内部类
public static class SInner {
// 内部类中的变量score
int score = 91;
public void show() {
System.out.println("访问外部类中的score:" + HelloWorld.score);
System.out.println("访问内部类中的score:" + score);
}
}
// 测试静态内部类
public static void main(String[] args) {
// 直接创建内部类的对象
SInner si = new SInner();
// 调用show方法
si.show();
}
}
运行结果:
访问外部类中的score:84
访问内部类中的score:91
小总结:
- 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类()
- 因为静态内部类是static修饰的,和静态变量一样,静态的不能直接访问非静态的,所以如果静态内部类想要访问外部类的非静态成员,需要通过new 外部类().成员的方式访问
方法内部类
什么是方法内部类?
就是在外部类的方法中定义的类,方法内部类能只在该方法内可以使用
//外部类
public class HelloWorld {
private String name = "sober";
// 外部类中的show方法
public void show() {
// 定义方法内部类,不能添加
class MInner {
int score = 83;
public int getScore() {
return score + 10;
}
}
// 创建方法内部类的对象
MInner mi = new MInner();
// 调用内部类的方法
int newScore = mi.getScore();
System.out.println("姓名:" + name + "\n加分后的成绩:" + newScore);
}
// 测试方法内部类
public static void main(String[] args) {
// 创建外部类的对象
HelloWorld hello = new HelloWorld();
// 调用外部类的方法
hello.show();
}
}
运行结果:
姓名:sober
加分后的成绩:93
注意:由于 方法内部类 不能在 外部类的方法 以外的地方使用,因此 方法内部类 不能使用访问控制符和static修饰符。
匿名内部类
还没有学~~~~学完来补全。