Java入门-instanceof运算符与内部类
Java入门-第十五节-instanceof运算符与内部类
一 instanceof运算符
•instanceof运算符用于判断该运算符前面引用类型变量指向的对象是否是后面类,或者其子类、接口实现类创建的对象。如果是则返回true,否则返回false,其使用格式如下:
引用类型变量instanceof(类、抽象类或接口)
•instanceof运算符用于强制类型转换之前检查对象的真实类型以避免类型转换异常,从而提高代码健壮性。
二 内部类
•内部类是指在一个外部类内定义的类。
Ø按照是否有类名分为有名内部类和匿名内部类。
有名内部类:在其他类中创建对象时
非静态
静态
匿名内部类:
1.匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类,其语法格式如下:
new 父类构造器([参数列表])|接口(){
//匿名内部类类体
}
普通类:普通类匿名内部类实质为普通类的子类
抽象类:抽象类匿名内部类实质为抽象类的子类。
接口:接口匿名内部类实质为接口的实现类。
•匿名内部类特点:
Ø匿名内部类一定是接口的实现类(该实现类仅能实现一个接口)或类(普通类或抽象类)的子类;
Ø匿名内部类不能有构造方法,但是可以通过非静态代码块初始化成员变量;
Ø匿名内部类一定不能是抽象类;
Ø可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用,例如:
•按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类,
静态匿名内部类
Ø如果为static内部类只能直接定义在外部类中。
Ø静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。
•内部类特点:
Ø内部类是一个独立的类:编译之后内部类会被编译成独立的.class文件,如果该内部类为有名内部类,则有名内部类字节码文件名为外部类的类名+$+内部类类名;如果为匿名内部类,则匿名内部类字节码文件名为外部类的类名+$+数字;
Ø普通外部类、抽象类和接口可以有内部类(匿名的或有名的);
Ø内部类可以直接定义在类中,也可以定义在方法或代码块中;其中直接定义在外部类中的内部类可以有public、protected、默认的和private四种访问权限修饰(普通外部类、接口和抽象类只能使用public和default修饰),也可以使用static修饰(static不能修饰普通外部类、接口和抽象类);但是定义在方法或代码块中的内部类不能有访问修饰符修饰,也不能有static修饰。
Ø在局部变量作用的范围内,如果定义的内部类需要使用该局部变量,则该变量必须有final修饰。
•Java支持Lambda 表达式始于Java 8,它的出现简化了函数式接口匿名内部类的语法,其表达式语法如下:([参数1],[参数2],[参数3],....[参数n])->{代码块}
•如果方法没有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1],[参数2],[参数3],....[参数n])->单行语句,如下例:
•如果方法有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1],[参数2],[参数3],....[参数n])->表达式,如下例: