instanceof
-
作用:判断一个对象是否为一个类或其子类的实例,或是其接口的实现类实例,若为真返回布尔值true,否则为false。多用于强制转换前的关系判断。
-
形式:
boolean result = 对象 instanceof 类名;
-
注意:若对象不能转换成右边的类,则编译器报错。对象不能是基本类型。对象为
null
时为false。
static
类中的静态变量可直接用类名去访问,当前类中的静态方法也可以直接用类名在主启动类中调用。
类中的普通方法或静态方法可以直接调用静态方法,因为静态方法会随着类一起加载。
{
//匿名代码块 2,可用于赋初始值
}
static{
//静态代码块 1,只会在第一次创建对象时执行一次
}
public 类名(){
//构造器 3
}
静态导入包:
import static java.lang.Math
被final
修饰的类会断子绝孙,无法继承。
抽象类
用abstract
关键字修饰的类,抽象类中可以有抽象方法,同样用abstract
关键字修饰,只有类的框架和方法名,没有具体实现。
抽象类相当于一个约束,只能由它的子类去实现(重写父类抽象方法),除非子类也是抽象类。由关键字extends
实现,因此是单继承,用途不广。
- 特点
- 抽象类不能去实例化
new
,只能靠子类实现。 - 抽象方法必须写在抽象类中,但抽象类中可以写普通方法。
- 抽象类的图标是蓝色的
c
旁边两条杠。
- 抽象类不能去实例化
接口
约束和实现分离,没有任何方法的实现,仅有约束作用。接口的本质是契约,由关键字interface
定义,图标是绿色的I
。由关键字implements
联系的类可以实现接口,且多继承。
- 接口形式:
public interface 接口名{
//接口中定义的所有方法都是默认由public abstract修饰的,因此可省略
//接口中定义的属性默认为常量,public static final
void 方法名(形参变量);
}
- 实现类:以
Impl
结尾
public class 接口名Impl implements 接口名{
重写方法;//必须步骤
}
//多继承
public class 接口名Impl implements 接口名1,接口名2{
重写方法;
}
- 注意:接口中没有构造器,不能被实例化。
父类引用指向子类对象详解
假设有一个父类Father,它里面的变量需要占用1M内存,它的一个子类Son,它里面的变量需要占用0.5M内存。
内存分配情况
Father f = new Father();//系统将为对象分配1M内存
Son s = new Son();//系统将为对象分配1.5M内存!因为实例化子类前会先执行父类的构造器
Father f1 = new Son;//或Father f1 = (Father)s;
/*
为向上类型转换,此时f1指向Son类对象1.5M内存中的1M内存,即f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法
*/
Son s2 = (Son)f;//Error
/*
不可直接向下类型转换。因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换.
*/
Son s3 = (Son)f1;//强制类型转换,向下,前提是父类引用要先指向子类对象
/*
s3指向那1.5M的内存.由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存
*/