今天来讲java中的多态性,多态性我个人认为它是最重要,同时也是最难理解的!!!不过不用担心,下面就带你了解java中的多态性!
下面是代码分析
public class ConversionTest {
public static void main(String[] args) {
double d = 13.4;
long l = (long) d;
System.out.println(l);
int in = 5;
Object obj = "Hello";
String objStr = (String) obj;
System.out.println(objStr);
Object objPri = new Integer(5);
// 所以下面代码运行时引发ClassCastException异常
String str = (String) objPri; }
}
运行结果
13
Hello
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
at ConversionTest.main(ConversionTest.java:33)
public class Test {
public void method(Person e) { // 设Person类中没有getschool() 方法
// System.out.pritnln(e.getschool()); //非法,编译时错误
if (e instanceof Student) {
Student me = (Student) e; // 将e强制转换为Student类型
System.out.pritnln(me.getschool());
} }
public static void main(String[] args){
Test t = new Test();
Student m = new Student();
t.method(m); //子类自动向父类转型
} }
子类继承父类若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的 同名方法,系统将不可能把父类里的方法转移到子类中。对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的 实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量
接下来我们说下,目前学习中我听过最中二的名字终极父类(Objext)
——Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点
包含了所有Java类的公共属性,其构造方法是Object( )
到这里我们随便讲下== 和equals以及还有终极父类中方法
看到这里,你以为完了??趁热打铁我们下面来了解下包装类
我们都知道java有基本数据类型和引用数据类型,而它的口号又是“万事万物皆对象”,所以针对基本数据类型,他提出了包装类的概念,实现从基本数据类型到类的转化!!
下面看下一道踩坑题:(你会中枪的,我说的)
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);
System.out.println(1==i);
System.out.println(1==j);
System.out.println(i.equals(1));
System.out.println(j.equals(1));
Integer m = 1;
Integer n = 1;
System.out.println(m == n);
Integer x = 128;
Integer y = 128;
System.out.println(x == y);
运行结果:
false
true
true
true
true
true
false解释:
基本数据类型与引用数据类型进行比较时,引用数据类型会进行拆箱,然后与基本数据类型进行值的比较
引用数据类型与基本数据类型进行比较,基本数据类型会进行自动装箱,与引用数据类型进行比较,Object中的equals方法比较的是地址,但是Integer类已经重写了equals方法,只要两个对象的值相同,则可视为同一对象,具体看API文档,所以这归根到底也是值的比较!
如果引用数据类型是直接new的话,不管值是否相同,这时两个对象都是不相同的,因为都会各自在堆内存中开辟一块空间
如果引用数据类型是这样 Integer i = 12;直接从常量池取对象,这是如果数值是在-128与127之间,则视为同一对象,否则视为不同对象
从常量池取对象跟new出来的对象也是不同的
举例:
Integer i = 12;
Integer j = new Integer(12)
i == j 这时返回的是false