------- android培訓、java培訓、期待與您交流! ----------
多態:
定義:某一類事物的多種存在形態。
例:動物中貓,狗。
貓這個對象對應的類型是貓類型
貓x = new貓();
同時貓也是動物中的一種,也可以把貓稱爲 動物。
動物y = new貓();//向上轉型
動物是貓和狗具體事物中抽取出來的父類型。
父類型引用指向了子類對象。
1、 多態的體現:
父類的引用指向了自己的子類對象。
父類的引用也可以接收自己的子類對象。
2、多態的前提
必須是類與類之間有關係。要麼繼承,要麼實現。
通常還有一個前提:存在覆蓋。
3、多態的好處
多態的出現大大的提高程序的擴展性。
4、多態的弊端:
雖然提高了擴展性,但是隻能使用父類的引用訪問父類中的成員。
如何使用子類特有方法(轉型)?
publicclass DuoTaiDemo {
publicstaticvoid main(String[] args)
{
//Animal a = new Cat();//類型提升。向上轉型。
//a.eat();
//如果想要調用貓的特有方法時,如何操作?
//強制將父類的引用。轉成子類類型。向下轉型。
///Cat c = (Cat)a;
//c.catchMouse();
//千萬不要出現這樣的操作,就是將父類對象轉成子類類型。
//我們能轉換的是父類應用指向了自己的子類對象時,該應用可以被提升,也可以被強制轉換。
//多態自始至終都是子類對象在做着變化。
// Animal a = new Animal();
// Cat c = (Cat)a;
function(new Dog());
function(new Cat());
}
publicstaticvoid function(Animal a)//Animal a = new Cat();
{
a.eat();//因爲父類中只有eat方法,所以正多態中只能調用這個方法。
/*
if(a instanceof Animal)//這個判斷不管a是誰(Cat、Dog、Pig)都是正確的true
{
System.out.println("haha");
}
*/
if(a instanceof Cat)
{
Cat c = (Cat)a;//通過向下轉型,轉爲子類引用,就可以用子類特有方//法了
c.catchMouse();
}
elseif(a instanceof Dog)
{
Dog c = (Dog)a;
c.kanJia();
}
/*
instanceof : 用於判斷對象的類型。對象 intanceof類型(類類型接口類型)
*/
}
}
abstractclass Animal{
publicabstractvoid eat();
}
class Cat extends Animal{
publicvoid eat(){
System.out.println("喫魚");
}
publicvoid catchMouse(){
System.out.println("抓老鼠");
}
}
class Dog extends Animal{
publicvoid eat(){
System.out.println("啃骨頭");
}
publicvoid kanJia(){
System.out.println("看家");
}
}
class Pig extends Animal{
publicvoid eat(){
System.out.println("飼料");
}
publicvoid gongdi(){
System.out.println("拱地");
}
}
例子:
/*
基礎班學生:
學習,睡覺。
高級班學生:
學習,睡覺。
可以將這兩類事物進行抽取。
*/
abstract class Student
{
publicabstract void study();
publicvoid sleep()
{
System.out.println("躺着睡");
}
}
class DoStudent
{
publicvoid doSome(Student stu)
{
stu.study();
stu.sleep();
}
}
class BaseStudent extends Student
{
publicvoid study()
{
System.out.println("basestudy");
}
publicvoid sleep()
{
System.out.println("坐着睡");
}
}
class AdvStudent extends Student
{
publicvoid study()
{
System.out.println("adv study");
}
}
class DuoTaiDemo3
{
publicstatic void main(String[] args)
{
DoStudentds = new DoStudent();
ds.doSome(newBaseStudent());
ds.doSome(newAdvStudent());
// BaseStudentbs = new BaseStudent();
// bs.study();
// bs.sleep();
// AdvStudentas = new AdvStudent();
// as.study();
// as.sleep();
}
}
多態成員的特點:
1、成員函數(非靜態):編譯時:要查看引用變量所屬的類中是否有所調用的成員。
在運行時:要查看對象所屬的類中是否有所調用的成員。
終而言之:成員函數在多態調用時,編譯看左邊,運行看右邊
2、 成員變量:只看引用變量所屬的類。
3、 在多態中,靜態成員函數的特點:
不論編譯和運行都參考左邊(引用型變量所屬的類)
package e1;
class Fu
{
intnum = 5;
staticintnum1 = 3;
void method1()
{
System.out.println("fumethod_1");
}
void method2()
{
System.out.println("fumethod_2");
}
staticvoid method4()
{
System.out.println("fumethod_4");
}
}
class Zi extends Fu
{
intnum = 8;
staticintnum1 = 6;
void method1()
{
System.out.println("zimethod_1");
}
void method3()
{
System.out.println("zimethod_3");
}
staticvoid method4()
{
System.out.println("zimethod_4");
}
}
publicclass DuoTaiDemo4
{
publicstaticvoid main(String[] args)
{
// Fu f = new Zi();//2、在多態中,成員變量特點:
// System.out.println(f.num);
// Zi z = new Zi();
// System.out.println(z.num);
//f.method1();//1、在多態中,成員函數(非靜態)特點:
//f.method2();
//f.method3();
Fu f = new Zi();//3、在多態中,靜態成員函數的特點:
System.out.println(f.num1);
f.method4();
Zi z = new Zi();
z.method4();
// Zi z = new Zi();
// z.method1();
// z.method2();
// z.method3();
}
}
Object類—equals()
equals(Object b);比較的是地址值。實現其他比較功能要子類覆寫。
Object類中已經提供了對對象是否相同的比較方法。如果自定義類中也有比較相同的功能,沒有必要重新定義,只需要沿襲父類中的功能,建立自己特有比較內容即可——覆蓋。
class Demo //extends Object
{
private int num;
Demo(int num)
{
this.num = num;
}
public booleanequals(Object obj)//Object obj = new Demo();
{
if(!(objinstanceof Demo))
returnfalse;
Demo d =(Demo)obj;
return this.num== d.num;
}
/*
public booleancompare(Demo d)
{
returnthis.num==d.num;
}
*/
public String toString()
{
return"demo:"+num;
}
}
class Person
{
}
class ObjectDemo
{
public static voidmain(String[] args)
{
Demo d1 = newDemo(4);
System.out.println(d1);//輸出語句打印對象時,會自動調用對象的toString方法。打印對象的字符串表現形式。
Demo d2 = newDemo(7);
System.out.println(d2.toString());
//Demo d2 = newDemo(5);
//Class c =d1.getClass();
//
// System.out.println(c.getName());
// System.out.println(c.getName()+"@@"+Integer.toHexString(d1.hashCode()));
// System.out.println(d1.toString());
//Person p =new Person();
///System.out.println(d1.equals(p));
}
}
Object類toString()
任意對象都可以轉爲字符串,toString()方法返回一個字符串,該字符串由類名、@、和此對象哈希值的無符號十六進制組成。
返回的字符串等於“getClass().getName()+‘@’+Integer。toHexString(hashCode())”組成。
------- android培訓、java培訓、期待與您交流! ----------詳細請查看:http://edu.csdn.net