由java的继承和向上转型,子类能够很天然地转换为父类对象,即父类类型能够直接引用子类对象,可是子类类型不能直接引用父类对象,须要进行强制转换。子类比父类拥有更多的属性和更强的功能,这个时候咱们使用功能较弱的类型(父类)引用功能较强的对象(子类),这是可行的。可是将功能较弱的类型(父类)强制转功能较强的对象(子类)时,就不必定能够行了。java
向上转型,子类对象将引用赋予父类类型, java容许一个对象能够不被其对应的类型所引用,而被其父类类型引用,从而可使用其父类类型,父类引用没法调用子类对象中父类没有的方法,向上转型会有子类特性丢失。如:father.fat(),father中只能调用fat()方法,而没法调用so()方法。若须要使用其原对象特性,这时就须要向下转型了,用一个它自己类型的变量来引用它。code
向下转型是能够成功的,如:(Son)father,①中的向下转型失败是由于father自己的对象是Father,强制转换会使做用域溢出(ClassCastException:当前者的域小于后者的时候出现),而②中father自己就是Son对象,(Son)father只是让其恢复自己特性,因此是能够成功的。可是说到底父类对象仍是没法转换为子类所引用。父类引用能够指向子类对象,可是子类引用却不能指向父类对象。对象
当咱们用一个类型的构造器构造出一个对象时,这个对象的类型就已经肯定的,也就说它的本质是不会再发生变化了。如:father被赋予的是Son类的对象,因此father调用的fat()方法是Son对象中的fat()方法,Son对象即便被赋予给了father类型,但其自己仍是Son对象,调用的方法仍是原对象中的方法。继承
public class Father { public void fat(){ System.out.println("I`m father"); } } public class Son extends Father { public void fat(){ System.out.println("I`m a father of my son"); } public void so() { System.out.println("I`m son"); } } public class TypeStrong { public static void main(String[] args) { Son son = new Son(); Father father = son;//向上转型,父类引用指向了子类对象,此时子类对象的类型为父类引用的类型 father.fat();//只能调用fat()方法,没法调用so()方法,且fat()输出为:I`m a father of my son father = (Son) father;//依然没法调用so()方法,由于father为Father类型 ((Son) father) .so();//终于能够调用了... // Father father2 = new Father(); // Son son2 = (Son) father2;//①运行出错,ClassCastException,父类对象不能为子类的类型引用 Son son2 = (Son) father;//②运行成功,向下转型,将本来父类引用赋予到子类引用上,固然此时仍是子类对象为子类的类型引用 } }
将一种类型的数据赋给另一种类型变量时,知足下列两种要求将执行自动类型转换:1.两种类型是兼容的 ;2.目的类型的范围比来源类型大 。作用域
数值类基本数据类型按照范围大小可分为:byte,short,char,int,long,float,doubleio
数值类数据类型和字符类数据类型、布尔类数据类型不兼容,字符类数据类型和布尔类数据类型互相也不兼容。ast
注意:class
- byte、short、char类型进行 + 操做,最后得出的结果为int数据类型
- 字符类数据类型与数值类数据类型进行 + 操做,最后得出的结果为字符类数据类型