1、内部类总结
/**
* 内部类的位置
* 1、Java中允许将一个类 A 生命在一个类B中 则类A称为内部类 类B 称为外部类
* 2、成员内部类(分为 静态 和 非静态) 2、局部内部类(方法内,形参,代码块内,构造器内)
*
* 3、成员内部类能干什么
* 一方面 作为一个 类
* > 可以有 属性 方法 构造器
* > 可以有final 修饰 不能 被继承
* > 可以 被 abstract修饰
* 一方面 作为一个外部类的成员
* >可以和外部类的方法 一样调用 外部类的 属性 方法 (非静态的)
* 这里要注意属性重名和不重名的使用方式
* >内部类可以 被四种权限修饰符修饰
*
* 4、开发中怎么使用内部类
* 4.1 如何实例化 内部类(注意静态和非静态的 区别)
* 4.2 如何在成员内部类中如何调用外部类的 结构
* 4.3 开发中常用的 内部类使用的方式有那些。
* 5、局部内部类常见的使用方式
* 5.1 返回一个匿名对象
* 5.2 返回一个匿名类的匿名对象
* 5.3 使用Lambda表达式返回一个匿名类的匿名对象
*
* 5、外部类被加载的时候 内部类不一定会立即加载 (内部类主动调用的时候加载)
* 5.1 可以使用静态代码块的方式测试
*
*
*/
2、成员内部类之非静态内部类
2.1 代码示例
//成员内部类的
public class Persion {
String name = "小明";
int age = 20;
public void eat() {
System.out.println("人吃饭");
}
//非静态内部类
class Bird {
private String name = "dujuan";
public void sing() {
System.out.println("唱歌");
Persion.this.eat(); //调用外部类的非静态属性(方法)
//这里的age 直接调用的是外部类的非静态属性
System.out.println(age);
}
//因为name 有 三个,该方法中调用不同位置的属性使用方式不一样。
public void fly(String name){
//调用形参的属性
System.out.println(name);
//内部类bird类的name
System.out.println(this.name);
//调用外部类的非静态属性
System.out.println(Persion.this.name);
}
}
}
2.2 成员内部类之非静态内部类测试
//成员内部类的实例化方式
public class InnerClassTest {
public static void main(String[] args) {
Persion persion = new Persion();
//创建Bird非静态的内部类
Persion.Bird bird = new Persion().new Bird();
bird.sing();
bird.fly("黄鹂");
}
}
![]()
3、成员内部类之静态内部类
3.1 代码示例
//成员内部类的
public class Persion {
String name = "小明";
int age = 20;
public void eat() {
System.out.println("人吃饭");
}
//静态内部类
static class Dog {
private String name;
public final static String SEAON = "AUTOMU";
public void show() {
System.out.println("卡拉是条狗");
}
static {
System.out.println("内部类 被加载");
}
}
}
3.2 成员内部类之静态内部类测试
//成员内部类的实例化方式
public class InnerClassTest {
public static void main(String[] args) {
Persion persion = new Persion();
//创建Dog 静态内部类
Persion.Dog dog = new Persion.Dog();
dog.show();
}
}
4、局部内部类
4.1 代码示例
/**
* 局部内部类
*/
public class JuBuInnerClass {
//比较少的使用方式---> 方法中声明一个类
public void method(){
//局部内部类
class AA{
}
}
//这样的使用方式比较多
public Comparable getComparable(){
//创建一个实现Comparable的类 局部内部类 方式一 比较标准的方式
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
//返回一个匿名对象
return new MyComparable();
}
//这样的使用方式比较多 局部内部类 方式二 返回一个匿名类的匿名对象
public Comparable getComparable1(){
int s = 20;
//返回一个实现Comparable接口的匿名类的匿名对象
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
}
//这样的使用方式比较多 局部内部类 方式三 采用lambda表达式
public Comparable getComparable2(){
int s = 20;
return (o -> {
int s1 = (int) o;
return s1 - s;
});
}
}
4.2 局部内部类的测试
public class JuBuInnerClassTest {
public static void main(String[] args) {
JuBuInnerClass juBuInnerClass = new JuBuInnerClass();
Comparable comparable = juBuInnerClass.getComparable2();
Integer res = comparable.compareTo(23);
System.out.println(res);
}
}