目录
成员内部类
静态内部类
局部内部类
匿名内部类
1.成员内部类是什么?如何创建其对象?
·就是类中的一个普通成员,类似前面我们学过的普通成员变量、成员方法
外部类名.内部类名 对象名= new 外部类(…). new 内部类(…);
2.成员内部类的实例方法中,访问其他成员有啥特点?
.可以直接访问外部类的实例成员、静态成员
.可以拿到当前外部类对象,格式是:外部类名. this 。
package com.xinbao.d1_inner_class1;
public class Outer {
private int age = 99;
private static String a;
//成员内部类
public class Inner {
private String name;
public static String schoolName;//JDK16开始才支持定义静态成员变量
private int age = 88;
public void test() {
System.out.println(age);//88
System.out.println(a);//null
int age = 66;
System.out.println(age);//66
System.out.println(this.age);//88
System.out.println(Outer.this.age);//99
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public void test2(){
System.out.println(age);
System.out.println(a);
}
}
package com.xinbao.d1_inner_class1;
public class Test {
public static void main(String[] args) {
//目标:了解成员内部类和其他特点
Outer.Inner in = new Outer().new Inner();
in.test();
}
}
E:\JVsoft\Java\jdk-17\bin\java.exe -javaagent:E:\JVsoft\IntelliJIDEA2021.1.1\lib\idea_rt.jar=46006:E:\JVsoft\IntelliJIDEA2021.1.1\bin -Dfile.encoding=UTF-8 -classpath E:\JVsoft\code\out\production\oop-app5 com.xinbao.d1_inner_class1.Test
88
null
66
88
99
Process finished with exit code 0
1.什么是静态内部类?如何创建对象?有啥特点?
●有 static 修饰的内部类。
.外部类名.内部类名对象名= new 外部类.内部类(.…);
●可以直接访问外部类的静态成员,不能直接访问外部类的实例成员。
package com.xinbao.d2_inner_class2;
public class Outer {
private int age;
public static String schooleName;
//静态内部类
public static class Inner{
private String name;
public static int a;
public void test(){
System.out.println(schooleName);
//System.out.println(age);//错误
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void test2(){
System.out.println(schooleName);
//System.out.println(age);//错误
}
}
package com.xinbao.d2_inner_class2;
public class Test {
public static void main(String[] args) {
//目标:了解静态内部类
Outer.Inner in = new Outer.Inner();//直接通过类名访问
in.test();
}
}
局部内部类是定义在方法中、代码块中、构造器等执行体中
package com.xinbao.d2_inner_class2;
public class Test2 {
public static void main(String[] args) {
class B{};
}
public static void go(){
class A{};
abstract class C{};
interface D{};
}
}
就是一种特殊的局部内部类,所谓匿名,就是指程序员不需要为这个类声明名字
new 类或接口(参数值){
类体(一般是方法重写)
};
特点:
本质就是一个子类,并会立即创建一个子类对象
作用:
可以更方便的创建出一个子类对象;匿名内部类通常作为一个参数传输给方法
例1:
package com.xinbao.d3_inner_class3;
public class Test {
public static void main(String[] args) {
//目标:认识匿名内部类,并掌握其作用
// Animal a = new Cat();
// a.cry();
//1.把这个匿名内部类编译成一个子类,然后会立即创建一个子类对象出来
Animal a = new Animal() {
@Override
public void cry() {
System.out.println("喵喵喵~~");
}
};
a.cry();//喵喵喵~~
}
}
//class Cat extends Animal{
//
// @Override
// public void cry() {
// System.out.println("喵喵喵~");
// }
//}
abstract class Animal{
public abstract void cry();
}
例2:
package com.xinbao.d3_inner_class3;
public class Test2 {
public static void main(String[] args) {
Swimming s1 = new Swimming(){
@Override
public void swim() {
System.out.println("The dog is swimming.");
}
};
go(s1);
go(new Swimming() {
@Override
public void swim() {
System.out.println("The cat is swimming.");
}
});
}
public interface Swimming{
void swim();
}
public static void go(Swimming s){
System.out.println("start-------------");
s.swim();
}
}
E:\JVsoft\Java\jdk-17\bin\java.exe -javaagent:E:\JVsoft\IntelliJIDEA2021.1.1\lib\idea_rt.jar=13185:E:\JVsoft\IntelliJIDEA2021.1.1\bin -Dfile.encoding=UTF-8 -classpath E:\JVsoft\code\out\production\oop-app5 com.xinbao.d3_inner_class3.Test2
start-------------
The dog is swimming.
start-------------
The cat is swimming.
Process finished with exit code 0