目录
- 一、内部类
- 1、内部类详解
- 2、内部类分类
- 1)定义在外部类局部位置上
- 2)定义在外部类成员位置上
- 3、局部内部类的使用
- 4、匿名内部类的使用
一、内部类
1、内部类详解
定义:
一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类,嵌套它的类称之为外部类。
特点:
可以直接访问私有属性,可以提现类与类之间的包含关系
注意:
内部类是重点,也是学习难点,源代码有大量的内部类
语法:
class Outer{ //外部类
class Inner{ //内部类
}
}
class Other{ //外部其他类
}
public class ClassStructure { //其它外部类
public static void main(String[] args) {
Outer outer = new Outer();
}
}
class Inner { //内部类
private String name; //属性
private int age;
public Inner(String name, int age) { //构造器
this.name = name;
this.age = age;
System.out.println("姓名: " + this.name + ", 年龄: " + this.age);
}
}
class Outer { //外部类
private void run() { //方法
System.out.println("方法。。。。");
}
{ //代码块
System.out.println("代码块。。。。");
}
Inner inner = new Inner("张三", 18);
}
2、内部类分类
1)定义在外部类局部位置上
- 局部内部类(有类名)
- 匿名内部类(没有类名)
2)定义在外部类成员位置上
- 成员内部类(没用static修饰)
- 静态内部类(使用static修饰)
3、局部内部类的使用
局部内部类是定义在外部类的局部位置,例:方法带有类名
1、可以直接访问外部类的所有成员,包含私有
2、不能添加访问修饰符,它是一个局部变量。局部变量不能使用修饰符,可以使用final修饰
3、作用域:方法或代码块中
4、局部内部类访问外部类成员直接访问
5、外部类访问内部类成员,创建新的对象,再访问(作用域内)
6、外部其它类不能访问局部内部类
7、外部类和内部类成员重名,遵循就近原则,或者使用外部类名.this.类名
public class ClassStructure { //其它外部类
public static void main(String[] args) {
Outer outer = new Outer();
outer.run();
}
}
class Outer { //外部类
private String name = "李四";
private void eat(){
System.out.println("苹果好吃");
}
public void run() { //方法
/*
局部内部类是定义在外部类的局部位置,一般在方法内
不能添加访问修饰符,可以使用final
作用域:方法或代码块中
*/
final class Inner2{ //局部内部类,其实还是一个类
//可以直接访问外部类的所有成员
private void running(){
//外部类和内部类成员重名,遵循就近原则,或者使用外部类名.this.类名
String name = "王五";
name = Outer.this.name;
System.out.println(name);
eat();
}
}
Inner2 inner2 = new Inner2();
inner2.running();
}
}
4、匿名内部类的使用
1、本质是类
2、没有类名
3、内部类
4、是一个对象
注意:
匿名内部类是一个类的定义,它也是一个对象,既有定义类特征,也有创建对象的特征。
语法:
new 类或接口(参数列表){
类体
}
interface Sports{
void run();
}
public class ClassStructure { //其它外部类
public static void main(String[] args) {
//当做实参直接传递使用
person(new Sports() {
@Override
public void run() {
System.out.println("喜欢跑步。。。。。。。。");
}
});
}
//静态方法,形参接口类型
public static void person(Sports sports){
sports.run();
}
}