java中new对象_java new对象的理解

new的解释

java里的new的英文意思就是"新的"的意思。在JAVA里就是创建一个新的实例,或者说一个新的对象,一个普通类在没有实例化之前,就是new之前,它的属性,方法等等在内存中都是不存在的。只有使用new了以后,这个类的一些东西在内存中才会真的存在,也就是说只有new了之后,这个类才能用。

举例说明:

Java中使用 new关键字 加上 构造方法,来创建一个对象,下面是一个名为Cat的类,public class Cat { public Cat() { System.out.println("这是构造方法"); }}使用new + 构造方法 来创建一个对象。

那么也就是Cat c = new Cat();前半部分,Cat c 的意思是,在内存中分配一个变量,名字叫c,这个变量是Cat类型的 是想创建的类型;后半部分,new Cat(); 这就是new关键字和构造方法来创建一个对象是实际给的类型,Cat()是构造方法的名字。

想造出一个对象来,需要运用;new Cat(); 说明 new这个Cat类的一个对象,程序运行的时候,会调用构造方法Cat(),等这个构造方法执行完了,这个Cat类型的对象也就造出来了,真正的出现在内存当中了。

使用new关键字造出来的对象,被分配在内存的堆区(heap),而且等这个对象真正出来之后,还会做一件重要的事情:new关键字创建出一个对象之后,会把这个对象在内存中的地址返回,通过这个地址就可以找到这个对象。

那么上面的写法,Cat c = new Cat();意思就是说,把这个对象在内存中的地址 赋值 给变量c,这就是Java中引用概念,c就叫做引用,或者叫引用变量,或者直接叫变量,没问题,都是它;c的值就是一个内存地址,或者叫引用地址。

通过这个地址,就可以准确的找到刚才创建出来的对象,以后我们要使用这个对象做一些事情,调用此对象的方法什么的,都用过这个引用。

java的父类声明new子类对象 和子类声明new子类对象

父类名 a = new 子类名()

子类名 b = new 子类名()

a只能调用父类有的函数和属性,如子类有重写则会输出重写的。不能调用子类自己的函数和属性,除非用强转。如为静态的方法或属性则是父类的。

((子类) a).子类自己的方法;

((子类) a).子类自己的属性;

b可以调用父类的函数和属性也可以调用子类的函数和属性(子类有重写则会输出重写的)。如为静态的方法或属性则是子类的。

(父类属性一般都private,不能调用)

但是对构造函数的执行上二者是没有区别的。

作用:

这个父类引用可以指向任意一个子类对象,增加了灵活性,尤其是在作为参数传递给方法的时候。

java接口对象 = new 实现类 与 实现类 对象= new 实现类

接口类 a = new 实现类()

实现类 b = new 实现类()

和上面继承的规则一样

可以这样总结,在调用成员变量以及静态方法时,“编译看左边,运行看左边”,即程序编译时创建了一个Animal类型的对象,并且使用new Cat()对于这个Animal对象赋值,但最终得到的还是一个Animal类的对象,调用静态方法或变量只需要看“=”左边的Animal animal即可。

但是要调用非静态方法时,由于Animal类的对象是用Cat()来实例化的,这个非静态方法在运行时会被重写,从而输出子类中方法重写后的结果。这就是“编译看左边,运行看右边”。

作用

实例化对象调用方法,你就会发现使用接口 对象名 = new 类名; 方式实例化的对象只能调用接口中有的方法,而不能调用类中特有的方法。而使用类名 对象名 = new 类名;方式创建出来的对象可以调用所有的方法

使用接口编程的好处是统一规范化。

你会发现无论多少个实现类,无论这些实现类有什么不同,使用接口 对象名 = new 类名; 方式实例化对象都可以调用接口中定义的方法,

在使用的时候,好像区别都不大。实例化对象调用方法,你就会发现使用接口 对象名 = new 类名; 方式实例化的对象只能调用接口中有的方法,而不能调用类中特有的方法。而使用类名 对象名 = new 类名;方式创建出来的对象可以调用所有的方法

但要是我不止一个实现类呢?如果A有实现类 B C D E。

用类名 对象名2 = new 类名;来写的话,我们要写5次,创建5个对象,如果用接口回调,我们只需要:

A a = new B(); a.方法名();

a=new C(); a.方法名()........来实现多态。

使用接口编程的好处是统一规范化。你会发现无论多少个实现类,无论这些实现类有什么不同,使用接口 对象名 = new 类名; 方式实例化对象都可以调用接口中定义的方法。

但是

接口回调的最大作用并不仅仅是为了统一规范化。这里举个例子:

public classwork {public static voidmain(String[] args) {

Phone A= new ClassA(); //Phone是父类,ClassA是实现类

CallUp(A);

A= newClassB();

CallUp(A);

}public static voidCallUp(Phone phone) {

System.out.println(phone.call(phone.num));//num是父类的一个属性

};

上面这里,Phone是一个基类,它代表所有的手机。

而ClassA和ClassB代表不同的手机型号,当然还有很多诸如iphone啊华为啊,小米啊之类的接口实现类。

现在我有一个打电话的功能叫做CallUp(),如果我们使用(实现类 a =new 实现类())的写法,那每个手机型号,我都需要写一个CallUp的方法来接收我的手机,每个手机的打电话方式(方法)都得不到统一。

如果我们使用接口回调,那我不管你是什么手机,反正只要能实现打电话的就行,所有的手机类型都可以放在Phone phone里面,我就不需要写很多次方法,毕竟手机型号这么多,难道我还得每一个手机型号都为他写一个方法?

由此可见,接口回调(接口 a = new 接口),不仅仅是为了规范,他最致命的优点是可以统一化管理所有子类,只需要提供一个共有的方法

强制类型转换

原文链接:https://blog.csdn.net/qq_39309348/article/details/88061031

原文链接:https://blog.csdn.net/u012198209/article/details/80064049

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值