内部类
内部类的概述
当一个事务的内部,还有一个部分需要一个完整的结构进行描述(用属性和行为描述会不完整),
那么这整个结构最好使用内部类;这个内部结构又为外部事务提供服务
内部类的基本使用
在一个类中定义一个类
内部类的语法格式:
class 外部类名{
class 内部类名{ }=====================称为内部类
}
public class Demo01 {
public static void main(String[] args) {
需要通过外部类对象创建内部类对象
Outer.Inner i=new Outer().new Inner();
i.show();
}
}
class Outer{
private int num=10;
class Inner{=======================================内部类
public void show(){
内部类可以直接访问外部类所有的资源(方法和变量),包括私有的!
System.out.println(num);
调用外部的方法
method();
} }
public void method(){
外部类要访问内部类的成员,必须创建内部类对象
Inner i=new Inner();
i.show();
}
}
内部类的分类
成员内部类和局部内部类
成员内部类:在类中定义的
也是一个类,作为一个类他有什么特征
(1).类中可以定义属性,方法 构造器
(2).可以被final和static和abstract修饰
Private 和 default 和 protected 和 public修饰
public class Demo02 {
public static void main(String[] args) {
Person.Cat c=new Person().new Cat();
c.display("花花");
}
}
class Person{
String name="person";
int age=10;
成员内部类
class Cat{
int age;
String name="cat";
public Cat( ){ }---------------------------------------无参构造器
public Cat(String name,int age){------------------------------------有参构造器
this.age=age;
this.name=name;
}
public void eat(){
System.out.println("猫在吃小鱼干");
}
public void display(String name){
System.out.println("方法参数name:"+name);--------就近原则,表示的是参数name
System.out.println("cat成员变量name:"+this.name);-----------是cat类的成员变量name
System.out.println("person成员变量name:"+Person.this.name);------表示的是外部类的name
}
} }
内部类---------------局部内部类
局部内部类:方法中定义
public class Demo02 {
public static void main(String[] args) { }
下列方法返回值是Y,则直接return new Y();
下列方法返回值是T,则不能直接return new T();-----------因为抽象类不能实例化
下列方法返回值是Compare,则不能直接return new Compare();-------因为接口不能实例化
public T getT( ){
局部内部类操作
class H extends T{
@Override-------------------------------------------创建局部内部类继承重写抽象类方法
public int Ttest() {
return 0; }
}
当方法返回值是一个抽象类的时候,不能直接创建抽象对象
所以在该方法中,创建类继承自抽象类,
然后return 该抽象类的子类对象
return new H() ;
}
}
abstract class T{-----------------------------------------抽象类
public abstract int Ttest();
}
class Y{---------------------------------普通类
}
接口局部内部类也是同理
public Compare getCompare(){
当方法返回值是接口的时候,不能直接new接口对象
可以在方法中创建该接口的实现类,
return 实现类对象
class Com implements Compare{
@Override
public int compareTo() {------------------------------------------创建局部内部类继承重写抽象类方法
return 0;
}
}
return new Com() ;
}
interface Compare{=======================接口
public int compareTo();=================方法
}
匿名内部类
写法格式:
接口名/类名 引用变量=new 接口/类名(){
重写的方法;
};
写法格式二:
new 接口/类名(){
重写的方法;
};
public class Demo03 {
public Compare test01( ){
return new Compare() {--------------------------匿名内部类
@Override
public int compareTo() {---------------------------------重写里面方法
return 0; }
};
} }
interface Compare{=======================接口
public int compareTo();=================方法
}
局部内部类为什么要继承抽象类?
抽象类不能实例化---抽象类中有抽象方法,抽象方法不完整
继承抽象类之后,重写了抽象方法
局部内部类为什么要实现接口?
接口不能实例化---接口中都是抽象方法,抽象方法不完整
实现接口之后,重写了接口中的抽象方法
案例:
A instanceof B
返回true的情况:
1: A是B类型的对象
2: A是B类型的子类对象
3: A是B类型的实现类对象
System.out.println(new Aoo() instanceof Boo);---------------------------返回false (错误的)
System.out.println(new To() instanceof Hoo);------------------------------返回的true
class Aoo{-----------------父类
}
class Boo extends Aoo{-----------------子类
}
interface Hoo {--------------------------------父类接口
}
interface Too extends Hoo{---------------------------子类继承父类接口
}
class To implements Too{---------------------------------做一个子类的实现类
}