疑难杂症_向上/下造型、new、引用、构造方法

前言

在Java中,我们经常做一件事情:

Object object = new Object();

对,就是new一个对象。但这句话到底是什么意思呢?向上/下造型时又为何能够new不同的东西呢?

new

new在Java中就是创建一个新的类型

在Java中,一个新的对象/普通类在没有被实例化之前,它的属性、方法等都不存在于内存中,只有在new了之后,这个类的一些东西在内存中才会真的存在,也即在new之后,这个类才能用

在这里插入图片描述

上图为运行时数据区,Java中通过new关键字+构造方法来创建一个对象

Object object = new Object();
  • 这句语句的前半部分意思为:在内存中分配一个变量,名字叫object,类型为Object,放入局部变量区
  • 这句语句的后半部分意思为:通过new关键字及构造方法Object()来在堆(Heap)中创建出一个Object对象

但在堆区中真正创建出一个Object对象后,还有一件事情要做…


引用

堆区中真正创建出一个Object对象后,需要将这个对象在内存中的地址交给变量 object,而object就叫做引用/引用变量/变量,其存储的值就是一个内存地址,叫做引用地址


构造方法

在上面的内容中,我们还提到了构造方法

new关键字+构造方法堆区创建出了一个实例对象

构造方法的作用,就是创建出一个类的实例,并对构造出来的这个类的实例进行初始化

  • 由此也不难理解为何构造方法名称必须与定义它的类名完全相同了。其不具备返回值类型(甚至连void也没有),构造方法的调用是在创建一个对象时使用new操作进行的。
  • 中必定有构造方法,若不写,系统自动添加无参构造方法接口 不允许被实例化,所以接口中没有构造方法构造方法也不能被staticfinalsynchronizedabstractnative修饰,其在初始化对象时自动执行,一般不能显示的直接调用。
  • 当完成对构造方法重载后,Java编译系统会自动按照初始化时最后面括号的参数个数及类型来自动对应判断,完成构造函数的调用
  • 构造方法允许被重载无参构造方法默认构造方法,与一般方法一样,构造方法可以进行任何活动,但通常是用来进行各种初始化活动
  • 构造代码块:
    • 简介
      在类中没与任何的前缀或后缀,并使用"{}"括起来的代码片段
    • 作用
      给对象进行初始化,对象一建立就执行,而且优先于构造函数执行
    • 构造代码块和构造函数的区别
      构造代码块是给所有不同对象的共性进行统一初始化,构造函数是给对应的对象进行初始化

向上/下造型

在实际情况中,我们可能会遇到如下情况:

class A{
	public void myMethod(){
		System.out.println("来自class A的myMethod方法");	
	}
}
class AOO extends A{
	@Override
	public void myMethod(){
		System.out.println("来自class AOO的myMethod方法");	
	}
}
class test{
	public static void main(String[] args){
		A test = new AOO();
		AOO TEST = (AOO)test;
	}
}

这很奇怪,为什么前面的类型与后面的构造方法不匹配呢?为什么类A的对象能被强转为类AOO的对象呢?

向上造型

上例中的A test = new AOO();语句即为向上造型
依上文对这个语句进行分析:

  • A test:在内存中创建一个名为test的变量,其数据类型为A
  • new AOO():在堆内存中创建出一个AOO的实际对象,并将其地址传给变量test

这也就解释了为什么我们在使用test变量作为A的实例对象使用某种公用方法时,调用的却是AOO重写的公用方法

向上造型的意义在于提高程序的灵活性和可扩展性。通过向上造型,我们可以将一个实际类型为子类的对象当作其父类类型来处理,这意味着我们可以在不知道子类具体类型的情况下编写通用代码,这种特性也是Java多态性的基础之一,它使得程序更易于扩展和维护

向下造型

向上造型部分我们通过解释A test = new AOO();语句,确定了变量test的数据类型为A,但是实例对象为AOO。也正因为变量test的数据类型为A,使得它只能调用A中的方法与变量,想要直接用test调用AOO中的方法与变量只能通过强转的方式将test强转为AOO类型后才可以,此时的强转过程即为向下造型

向下造型的意义在于,它允许我们在需要时对已经向上造型的对象进行还原操作,从而可以使用子类独有的方法和属性,但需要注意的是,如果向下造型的对象不是实际上的子类对象,将会抛出ClassCastException异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值