- 多态的前提条件:继承
- 可以简单理解为:把子类看成父类类型(反之是错误的)
优缺点
- 弊端: 只能使用父类(父接口)中定义的功能
- 好处: 函数的参数定义为父类(父接口)类型,可以接收所有父类的子类对象,从而避免了定义大量的参数为子类类型的函数
// 正常情况:猫就是猫 猫 mao=new 猫();
// 多态:把猫看成动物 动物 mao=new 猫();
abstract class Animal
{public abstract void eat();
}
class Cat extends Animal
{public void eat(){System.out.println("猫吃鱼");}public void catchMouse(){System.out.println("猫抓耗子");}
}
class Dog extends Animal
{public void eat(){System.out.println("狗吃骨头");}public void watch(){System.out.println("狗看门");}
}
class Demo15
{public static void main(String[] args){/*Cat mao=new Cat();mao.eat();mao.catchMouse();*///把猫看成父类类型,那么只能使用父类中定义的功能Animal mao=new Cat();mao.eat();//mao.catchMouse();}
}
弊端修饰
向下转型
abstract class Animal{public abstract void eat();
}
class Cat extends Animal{public void eat(){System.out.println("猫吃鱼");}public void catchMouse(){System.out.println("猫抓耗子");}
}
class Dog extends Animal{public void eat(){System.out.println("狗吃骨头");}public void watch(){System.out.println("狗看门");}
}
class Demo1{public static void main(String[] args){//向上转型(自动)//Animal mao=new Cat();//mao.eat();//向下转型//Cat cat=(Cat)mao;//cat.catchMouse();chi(new Cat());}public static void chi (Animal animal){animal.eat();if(animal instanceof Cat){//向下转型Cat mao=(Cat)animal;mao.catchMouse();}if(animal instanceof Dog){Dog gou=(Dog)animal;gou.watch();}}
}
instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符。
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
成员特点
- 成员变量: 编译时期看父类,运行结果也看父类;
- 成员方法: 编译时期看父类,运行结果看子类(子类重写了);
- 静态成员方法: 编译时期看父类,运行结果也看父类。
class Fu
{int age=55;public void show(){System.out.println("show fu");}public static void ff(){System.out.println("static fu");}
}
class Zi extends Fu
{int Weight;int age=66;public void show(){System.out.println("show zi");}public void fun(){System.out.println("fun zi");}public static void ff(){System.out.println("static zi");}
}
class Demo2
{public static void main(String[] args) {Fu zi=new Zi();System.out.println(zi.age);//55//System.out.println(zi.age);zi.show();//show zi//zi.fun();zi.ff();//static fu}
}
接口和多态
对类存在的语法,对接口也存在
interface inter
{public abstract void show();
}
class Test1 implements inter
{public void show(){System.out.println("show1");}
}
class Test2 implements inter
{public void show(){System.out.println("show2");}
}
class Demo5
{public static void main(String[] args) {Test1 t1=new Test1();fun(t1);Test2 t2=new Test2();fun(t2);}public static void fun(inter test){test.show();}
}
模板设计模式
实现一个功能时,功能的一部分是确定的,一部分是不确定,确定的部分还会用到不确定的部分,那么就把不确定的部分暴露出去,让子类去实现。
计算一个功能运行所需时间
确定的部分:记录一个开始时间,记录一个结束时间,结束时间 - 开始时间
不确定的部分:功能abstract class TimeTool {public final void times(){//记录一个开始时间//得到当前时间的毫秒值:1970.1.1long start=System.currentTimeMillis();//功能代码fun();//记录一个结束时间long end=System.currentTimeMillis();System.out.println("运行时间:"+(end-start));}public abstract void fun(); } class Zi extends TimeTool {public void fun(){for (int i=1;i<=3000;i++){System.out.println(i);}} } class Demo3 {public static void main(String[] args) {Zi zi=new Zi();zi.times();} }
Object
- 最顶层的类,超类;
- 提取的是万事万物的共性。
- 除了Object,其余的类都有父类
equals
boolean equals(Object obj)
多态 任意两个对象都能比较是不是同一个对象
Person ren=new Person(); Cat mao=new Cat(); boolean boo=ren.equals(mao); System.out.println(boo);
判断两个人是否是同龄人
class Person{int age;Person(){}Person(int age){this.age=age;}public boolean equals(Object obj){//各种情况都要考虑到,保证任何情况下都要有返回值if (obj==null)//避免空指针return false;if (obj instanceof Person){ //向下转型Person ren=(Person)obj;return this.age==ren.age;}return false;} } class Demo4 {public static void main(String[] args) {Person ren1=new Person(18);Person ren2=new Person(20);Boolean boo=ren1.equals(ren2);System.out.println(boo);} }
toString
输出一个对象时,默认调用toString方法,返回对象的字符串表示形式
class Person {//String toString(){}
}
class Demo{public static void main(String[] args){Person ren=new Person();System.out.println(ren);//Fu@15db9742 类名@hash值System.out.println(ren.toString());//Fu@15db9742//得到对象的哈希值int code=ren.hashCode();System.out.println(Integer.toHexString(code));//得到一个对象所对应的类名Class claz=ren.getClass();//得到类 Person.class 字节码String name=claz.getName();System.out.println(name);System.out.println(ren.getClass().getName()+"@"+Integer.toHexString(ren.hashCode()));}
}
由于输出一个对象时,默认调用toString方法。通常通过重写toString方法,来返回有用的数据。
class Person {int age;String name;Person(){}Person(int age,String name){this.age=age;this.name=name;}public String toString(){return name+','+age;} } class Demo{public static void main(String[] args){Person ren=new Person(28,"小明");System.out.println(ren);} }