目录
一.多态:
1.方法的多态:
2.对象的多态:
3.多态的注意事项与细节:
5.多态的应用:
二.Java的动态绑定机制:
三.多态应用:
1.多态数组:
2.多态参数:
三.Object类:
1.equals方法:
2.hashcode方法:
3.toString方法:
4.finalize方法:
一.多态:
方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础上的。
1.方法的多态:
方法的重写和重载就体现多态。
2.对象的多态:
- 一个对象的编译类型和运行类型可以不一致
- 编译类型在定义对象时,就确定了,不能改变
- 运行类型是可以变化的
- 编译类型看定义 = 号的左边,运行类型看 = 号的右边。
例:Animal animal = new Dog() 【animal编译类型是Animal,运行类型是Dog】
3.多态的注意事项与细节:
(1)多态的前提是两个对象存在继承关系
(2)向上转型:父类的引用指向子类的对象,可以调用父类中的所有成员,但不能调用子类特有成员。
(3)方法与属性调用时按照从子类开始查找
例:Animal animal = new Dog() 【animal编译类型是Animal,运行类型是Dog】
class Dog extends Animal 【aniaml可以调用父类中所有成员(访问权限内),不能调用子类的特有成员。】
(4)向下转型:
- 语法:子类类型 引用名 = (子类类型)父类引用
- 只能强转父类的引用,不能强转父类的对象
- 要求父类的应用必须指向当前目标类型的对象
- 当向下转型后,就可以调用子类类型中所有的成员
例:Animal animal = new Dog() ; Dog dog= (Dog) animal ;【编译类型是Dog运行类型也是Dog,可以调用Dog中的所有方法】
(5)属性的值看编译类型,编译类型看定义 = 号的左边。
(6)instanceOf比较操作符,用于判断对象的运行类型是否为某类型或则某类型的子类型,返回值为true或false。
注:方法找运行类型,属性找编译类型,对象找地址。
5.多态的应用:
二.Java的动态绑定机制:
1.当调用对象方法时,该方法会和该对象的内存地址/运行类型绑定
2.当调用对象属性时,没有动态绑定机制,哪里声明,使用哪里(调用方法中出现的属性)
三.多态应用:
1.多态数组:
定义:数组的定义类型为父类类型,里面保存的实际元素为子类类型。
public class Ployarray {public static void main(String[] args) {Person [] persons = new Person[5];persons[0] = new Person("jack",20);persons[1] = new Student("jeek",20,100);persons[2] = new Student("simth",28,80);persons[3] = new Teacher("scout",30,12000);persons[4] = new Teacher("king",50,10000);for (int i = 0; i < persons.length; i++) {//动态绑定机制,方法看运行机制System.out.println(persons[i].Say());}}
2.多态参数:
定义:方法定义的形参类型为父类类型,实参类型为子类类型。
public class Teat {public static void main(String[] args) {Woker tom = new Woker("ton",2500);Manager milan = new Manager("milan",5000,20000);Teat t = new Teat();t.showEmpSAnnual(tom);t.showEmpSAnnual(milan);t.testwork(tom);t.testwork(milan);}public void showEmpSAnnual(Employee e) {//编译类型为Employee,运行类型为传入对象的类//Employee e = new Woker();System.out.println(e.getAnnual());}public void testwork(Employee e){if(e instanceof Woker){((Woker) e).work();}else if(e instanceof Manager){((Manager) e).manage();}}
}
三.Object类:
1.equals方法:
(1)equals与= = 的区别:
- = = 既可以判断基本类型,又可以判断引用类型
- 如果 = =判断基本类型,判断的值是否相等。
- 如果 = =判断引用类型,判断的是地址是否相等。
equals是Object类中的方法,只能判断引用类型,默认判断地址相等,子类往往重写该方法,用于判断内容是否相等。
(2)equals的重写:
public class EqualsExercise {public static void main(String[] args) {Person person1= new Person("jack",10,'男');Person person2= new Person("makw",10,'男');System.out.println(person1.equals(person2));}}
class Person {private String name;private int age;private char gender;public boolean equals(Object obj){if(this == obj){return true;}if(obj instanceof Person){Person p = (Person)obj;return this.name.equals(p.name) && this.age== p.age && this.gender == p.gender;}return false;}public Person(String name,int age,char gender){this.name = name;this.age = age;this.gender = gender;}
2.hashcode方法:
- hashcode方法提高具有哈希结构的容器的效率
- 两个引用如果指向同一个对象,则哈希值是一样的。
- 哈希值是主要根据地址号,不能将哈希值等价于地址。
3.toString方法:
默认返回:全类名+@+哈希值的十六进制,子类往往重写toString方法,用于返回对象的属性信息。
当输出一个对象时,toString重写方法会被默认的调用。
public class toStringExercise {public static void main(String[] args) {Monster monster = new Monster("小妖怪","巡山的",1000);System.out.println(monster.toString());System.out.println(monster);}
}
class Monster{private String name;private String job;private double sal;public Monster(String name, String job, double sal) {this.name = name;this.job = job;this.sal = sal;}
//重写toString方法@Overridepublic String toString() {return "Monster{" +"name='" + name + '\'' +", job='" + job + '\'' +", sal=" + sal +'}';}
}
4.finalize方法:
- 当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法做一些释放资源的操作。
- 当某个对象没有任何引用,就会使用垃圾回收机制来销毁该对象,在销毁该对象钱,会调用finalize方法。
public class Finaliaze_ {public static void main(String[] args) {Car bmw = new Car("宝马");bmw = null;System.gc();System.out.println("程序退出");}
}
class Car {private String name;public Car(String name) {this.name = name;}@Overrideprotected void finalize() throws Throwable {System.out.println("我们销毁汽车"+name);System.out.println("我们释放了某些资源");}
}