一.内部类
????????1.介绍:将一个类A定义在另一个类B里面,里面那个类A为内部类,类B为外部类
? ? ? ? 2.格式:
public class Demo{
}
class t1{
class t2{
}
}
3.特点:1.内部类可以直接访问外部类的成员,包括私有成员
? ? ? ? ? ? ? 2.外部类访问内部类的成员,必须要建立内部类的对象
? ? ? ? 创建内部类对象格式:外部类名.内部类名 对象名=new 外部类型().new 内部类型();
? ? ? ? ? ? ? ? ? ? ? ? 示例:
public class Body {// 外部类
// 成员变量
private int numW = 10;
int num = 100;
// 成员方法
public void methodW1(){
System.out.println("外部类中的methodW1方法...");
}
public void methodW2(){
System.out.println("外部类中的methodW2方法...");
// 创建内部类对象
Body.Heart bh = new Body().new Heart();
// 访问内部类成员变量
System.out.println("内部类成员变量numN:"+bh.numN);
// 访问内部类成员方法
bh.methodN2();
}
public class Heart{// 成员内部类
// 成员变量
int numN = 20;
int num = 200;
// 成员方法
public void methodN(){
System.out.println("内部类中的methodN方法...");
// 访问外部类成员变量
System.out.println("外部类成员变量:"+numW);
// 访问外部类成员方法
methodW1();
}
public void methodN2(){
System.out.println("内部类中的methodN2方法...");
}
public void methodN3(){
int num = 300;
System.out.println("局部变量num:"+num);// 300
System.out.println("内部类成员变量num:"+this.num);// 200
System.out.println("外部类成员变量num:"+Body.this.num);// 100
}
}
}
public class Demo {
public static void main(String[] args) {
// 测试
// 创建外部类对象,调用外部类的方法methodW2
Body body = new Body();
body.methodW2();
System.out.println("=======================");
// 创建内部类对象,调用内部类的methodN方法
Body.Heart heart = new Body().new Heart();
heart.methodN();
System.out.println("=======================");
heart.methodN3();// 300 200 100
}
}
二.匿名内部类
? ? ? ? ? ? ? ? 介绍:内部类的简化写法,它的本质是一个`带具体实现的` `父类或者父接口``匿名`、子类对象
? ? ? ? ? ? ? ? ? ? ? ? 示例:
public abstract class Animal {
public abstract void eat();
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头...");
}
}
public class Test {
public static void main(String[] args) {
/*
- 匿名内部类的概述:本质就是继承了父类或者实现了接口的匿名子类的对象
- 匿名内部类的格式:
new 类名\接口名(){
方法重写
};
- 匿名内部类的作用: 为了简化代码,并没有什么特殊的功能
需求: 调用Aniaml类的eat()方法
1.创建一个子类继承Animal类
2.在子类中重写eat方法
3.创建子类对象
4.使用子类对象调用eat方法
想要调用抽象类中的方法,必须具备以上4步,那能不能减后呢? 可以 使用匿名内部类
*/
Animal anl1 = new Dog();
anl1.eat();
Animal anl2 = new Animal() {
@Override
public void eat() {
System.out.println("Animal子类的eat方法...");
}
};
anl2.eat();
}
}
|