1.内部类介绍
package com.itheima.demo11innerClass;
public class Outer {
//外部类的成员变量
int a = 10;
//外部类成员方法
public void show(){
System.out.println("外部类Outer的成员方法show");
}
//定义成员内部类
public class Inner{
//内部类成员变量
int b = 20;
//内部类成员方法
public void method(){
System.out.println("内部类Inner成员方法method!");
//在内部类中可以直接使用外部的成员变量和成员方法
System.out.println(a);
show();
}
}
}
package com.itheima.demo11innerClass;
/*
成员内部类的使用格式:定义在外部类的内部==>需要通过外部类来找到内部类
外部类名.内部类名 变量名 = new 外部类对象().new 内部类对象();
变量名.内部类的成员变量
变量名.内部类的成员方法
*/
public class Demo01 {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
System.out.println(oi.b);//20
oi.method();//内部类Inner成员方法method!
}
}
2.局部内部类
package com.itheima.demo12innerClass;
/*
2.局部内部类:定义在其他类的方法中
定义格式:
修饰符 class 外部类名{
修饰符 返回值类型 外部类方法名(参数列表){
(final)class 局部内部类名{
局部内部类的成员变量;
局部内部类的成员方法();
}
局部内部类名 变量名 = new 局部内部类名();
变量名.局部内部类的成员变量
变量名.局部内部类的成员方法();
}
}
使用格式:局部内部类的作用域就在方法中有效,出了方法就消失了
必须在方法中定义完毕之后,立即使用
*/
public class Outer {
//定义外部类的成员方法
public void outer(){
//定义局部内部类
final class Inner{
//定义局部内部类成员变量
private String name;
private int age;
public Inner() {
}
public Inner(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Inner{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//在定义完局部内部类之后,必须在方法结束前创建对象使用
Inner in = new Inner("迪丽热巴",18);
System.out.println(in);
}
}
package com.itheima.demo12innerClass;
public class Demo01 {
public static void main(String[] args) {
//创建外部类对象
Outer o = new Outer();
o.outer();
}
}
3.匿名内部类
new 爹就相当于new了个子类,要在里面重写父类方法
new 父类|接口(){ //相当于new抽象类子类
重写父类|接口中的方法;
}.父类方法();
//一次调用一个方法 这样可以省略子类,简化代码
package com.itheima.demo13innerClass;
/*
匿名内部类(重点)
匿名:没有名字
内部类:
匿名内部类写在成员位置,就是一个成员内部类
匿名内部类写在方法中,就是一个局部内部类
作用:简化代码
把子类继承父类,重写父类的方法,创建子类对象,合成一步完成
把实现类实现接口,重写接口的方法,创建实现类对象,合成一步完成
格式:new 爹
new 父类|接口(){
重写父类|接口中的方法;
}
注意:
匿名内部类最终产生的是一个子类|实现类对象
*/
public class Demo01 {
public static void main(String[] args) {
//普通类的匿名内部类
//new Zi().show();
new Fu(){
@Override
public void show() {
System.out.println("匿名内部类重写父类的show方法!");
}
}.show();
//抽象类的匿名内部类
//Animal a = new Cat();
//a.eat();
//a.sleep();
//多态
//父类类型 变量名 = new 匿名子类对象();
Animal a = new Animal(){
@Override
public void eat() {
System.out.println("匿名动物在吃饭!");
}
@Override
public void sleep() {
System.out.println("匿名动物在睡觉!");
}
};
a.eat();
a.sleep();
//接口的匿名内部类
//new Niao().fly();
new Fly(){
@Override
public void fly() {
System.out.println("没有名字的鸟在飞!");
}
}.fly();
}
}
package com.itheima.demo13innerClass;
public class Fu {
public void show(){
System.out.println("Fu类的show方法!");
}
}
package com.itheima.demo13innerClass;
public abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
package com.itheima.demo13innerClass;
public interface Fly {
public abstract void fly();
}