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 class work { public static void main(String[] args) { Phone A = new ClassA(); //Phone是父类,ClassA是实现类 CallUp(A); A = new ClassB(); CallUp(A); } public static void CallUp(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/chenssy/article/details/14111307
原文链接:https://blog.csdn.net/qq_39309348/article/details/88061031
原文链接:https://blog.csdn.net/u012198209/article/details/80064049