目录
一、内部类
0、前言
思维导图:
说明:
关于内部类还涉及一些其他问题,这里仅以四种内部类为依托进行展开,其他暂不讨论!
1、内部类概述
思维导图:
2、成员内部类
思维导图:
代码4.1:
package com.zibo.java.february.fourth;
public class Family { // 外部类
// 外部类属性:人数
private int number;
public Family() {
}
public Family(int number) {
this.number = number;
}
// 外部类方法:打印
public void letPeopleSay(){
// 原理:当外部类创建内部类对象的时候会隐式地将this对象传入构造方法内
System.out.println(new People().say());
}
// 只有内部类可以声明为私有类(private)
private class People{
// 内部类属性:爱好
private final String hobby = "读书";
// 原理:内部类的构造方法隐式地含有一个传入外部类对象的参数,因此内部类可以直接使用外部类对象的数据
// 内部类方法:说话
public String say(){
// 内部类既可以访问外部类数据(number)也可以访问内部数据(hobby)
return "我家有" + number + "口人,我们都能工作!我们都喜欢" + hobby + "!";
}
}
// 主方法用来运行程序
public static void main(String[] args) {
new Family(4).letPeopleSay(); // 我家有4口人,我们都能工作!我们都喜欢读书!
}
}
代码4.2:
package com.zibo.java.february.fourth;
public class OuterClass {
// 外部类变量a
private int a = 10;
// 内部类
public class InnerClass{
// 内部类变量a
private int a = 20;
public void getInt(){
// 局部变量a
int a = 30;
System.out.println(a); // 30,局部变量就近原则
System.out.println(this.a); // 20,内部类的成员变量
System.out.println(OuterClass.this.a); // 10,外部类的成员变量
}
}
}
代码5.1:
package com.zibo.java.february.fourth;
public class OuterClass {
// 外部类变量
private String outerName;
// 在外部类方法中创建对象
public void printInnerClassName(){
// 使用new关键字创建内部类对象
InnerClass innerClass = new InnerClass();
innerClass.setInnerName("内部类对象名字");
System.out.println(innerClass.getInnerName());
}
public String getOuterName() {
return outerName;
}
public void setOuterName(String outerName) {
this.outerName = outerName;
}
// 内部类
public class InnerClass{
// 内部类变量a
private String innerName;
public String getInnerName() {
return innerName;
}
public void setInnerName(String innerName) {
this.innerName = innerName;
}
}
}
// 下面是测试类
package com.zibo.java.february.fourth;
// 测试类
public class Main {
public static void main(String[] args) {
// 使用外部类对象创建内部类对象
OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
innerClass.setInnerName("内部类对象名字");
System.out.println(innerClass.getInnerName());
}
}
3、局部内部类
思维导图:
4、静态内部类
思维导图:
5、匿名内部类
思维导图:
代码3.1:
package com.zibo.java.march.one;
public class Main {
public static void main(String[] args) {
String text = "外部类text";
// 1、实现接口,创建一个”接口对象“;
Name name = new Name(){
// 可以有静态常量,必须创建时立即初始化
static final int age = 24;
static final String text = "内部类text";
// 不可以有静态方法
// 实现抽象方法
@Override
public String getName() {
String text = "局部text";
// 访问同名变量:只能就近访问
// 如果存在局部同名变量,不能访问内部类或外部类的同名变量
// 如果不存在局部同名变量,可以访问内部类或外部类的同名变量
// 如果也不存在内部类同名变量,可直接访问外部类的同名变量
return text; // 局部text
}
};
System.out.println(name.getName()); // 匿名内部类名字
// 2、继承抽象类,创建一类”抽象类对象“
Age age = new Age() {
@Override
public int getAge() {
return 10;
}
};
System.out.println(age.getAge()); // 10
}
}
// 接口
interface Name {
String getName();
}
// 抽象类
abstract class Age{
public abstract int getAge();
}