instanceof,static,抽象类,接口及父类引用指向子类对象详解

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内存
*/
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值