1.向上转型
将父类的对象转为子类对象。自动转换。
通过其子类进行父类的实例化操作,则如果调用的方法被子类覆写过。
则肯定是调用被覆写过的方法。
注意点:
转型后在子类中是无法找到在子类中定义的新方法的。
2.向下转型
将父类的对象转为子类对象。需要强制转换。
在进行对象向下转型的时候。有一个注意点。
如果两个没有关系的对象之间发生了转换了关系,则肯定出现此异常。
注意 :要想产生对象的向下转型。则肯定是要先产生一个向上转型。
3.对象的多态性的应用
4.instanceof 关键字
class A{ // 定义类A public void fun1(){ // 定义fun1()方法 System.out.println("A --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; // 调用fun1()方法 } }; class B extends A{ public void fun1(){ // 此方法被子类覆写了 System.out.println("B --> public void fun1(){}") ; } public void fun3(){ System.out.println("B --> public void fun3(){}") ; } }; class C extends A{ public void fun1(){ // 此方法被子类覆写了 System.out.println("C --> public void fun1(){}") ; } public void fun5(){ System.out.println("C --> public void fun5(){}") ; } }; public class InstanceofDemo02{ public static void main(String asrgs[]){ fun(new B()) ; fun(new C()) ; } public static void fun(A a){ a.fun1() ; if(a instanceof B){ B b = (B) a ; b.fun3() ; } if(a instanceof C){ C c = (C) a ; c.fun5() ; } } };
在java 中可以使用instanceof 关键字来判断一个对象到底是那个类的实例。
在开发中一定要注意,对于向下转型的操作最好增加instanceof验证。
以保证转型时候不会发生ClassCastException
要增加新的子类,肯定要修改fun 方法,这样一来就失去了灵活性。所以
在程序的开发中重点在父类中。只要父类设计足够合理。则开发肯定会非常的方便。
在开发中一定要记住以下一点:
一个类永远不要去继承一个实现好的类。而只能去继承一个抽象类或接口。
5.Object 类
如果一个类在没有定义的时候没有指定继承的是那个类。则就是默认是继承Object类。
对象在打印的时候是会默认去调去toString()方法的。
6.包装类
一切皆是对象。八大数据类型不是对象。
所以将八大数据类型包装成包装类。
如
基本数据类型 包装类
int ------------------------>Integer,
char ------------------------>Character,
short------------------------>Short,
double ---------------------->Double,
long ------------------------>Long,
float ----------------------->Float.
boolean --------------------->Boolean,
byte ------------------------>Byte.
此八大包装类所继承的父类不一定相同。
装箱和拆箱
装箱:将基本数据类型变成包装类。
int x = 30 ;
Integer f = new Integer(x); //装箱
拆箱:将包装类变成基本数据类型。
y = f.intValue(); //拆箱
在JDK1.5 后有了自动的去装箱的自动的拆箱功能。
7.匿名内部类
interface A{ public void printInfo() ; // } class X { public void fun1(){ this.fun2(new A(){ public void printInfo(){ System.out.println("Hello World!!!") ; } } ) ; } public void fun2(A a){ a.printInfo() ; } }; public class NoInnerClassDemo02{ public static void main(String args[]){ new X().fun1() ; // 实例化X类的对象,并调用fun1()方法 } }; 其中的new A()只使用了一个,故可以去使用匿名内部类。
- 其中的new A()只使用了一个,故可以去使用匿名内部类。