方法重写
package chapter07.D4方法重写; public class Animal { public void cry() { System.out.println("动物叫唤..."); } public Object m1(){ return null; } protected void eat(){ } }
package chapter07.D4方法重写; public class Dog extends Animal{ public void cry() {//子类方法名,参数要和父类完全一致 System.out.println("狗叫唤..."); } public String m1(){//返回类型可以是父类下级 return null; } public void eat(){//子类不缩小父类权限,只可扩大 } }
package chapter07.D4方法重写; public class Override01 { public static void main(String[] args) { } }
多态
package chapter07.D5多态; public class Animal { private String name; public Animal(String name) { this.name = name; } public String getName() { return name; } /* public void setName(String name) { this.name = name; }*/ }
package chapter07.D5多态; public class Dog extends Animal{ public Dog(String name) { super(name); } }
package chapter07.D5多态; public class Cat extends Animal{ public Cat(String name) { super(name); } }
package chapter07.D5多态; public class Food { private String name; public Food(String name) { this.name = name; } public String getName() { return name; } /* public void setName(String name) { this.name = name; }*/ }
package chapter07.D5多态; public class Bone extends Food{ public Bone(String name) { super(name); } }
package chapter07.D5多态; public class Fish extends Food { public Fish(String name) { super(name); } }
package chapter07.D5多态; public class Master { private String name; public Master(String name) { this.name = name; } //主人喂食物 /*public void feed(Dog d,Bone b){//传对象 System.out.println("主人"+name+"给"+d.getName()+"喂了"+b.getName());//父类的方法 } public void feed(Cat cat,Fish fish){ System.out.println("主人"+name+"给"+cat.getName()+"喂了"+fish.getName()); }*/ //简化 public void feed(Animal animal,Food food){//父类Animal 可以接受子类对象 同理Food System.out.println("主人"+name+"给"+animal.getName()+"喂了"+food.getName()); } }
package chapter07.D5多态; public class Poly01 { public static void main(String[] args) { Master tom = new Master("Tom"); Master jack = new Master("Jack"); Dog ww = new Dog("汪汪"); Bone gt = new Bone("炭烤骨头"); Animal wc = new Dog("旺财");//编译类型可以为父类,向上转型 Bone mz = new Bone("蜜汁骨头"); jack.feed(wc,mz); tom.feed(ww,gt); } }
多态细节
package chapter07.D5多态.Detail; public class Animal { String name="动物"; int age=10; public void sleep(){ System.out.println("睡"); } public void run(){ System.out.println("跑"); } public void eat(){ System.out.println("吃"); } public void show(){ System.out.println("你好"); } }
package chapter07.D5多态.Detail; public class Cat extends Animal{ public void eat(){ System.out.println("猫吃鱼"); } public void catchMouse(){ System.out.println("猫抓老鼠"); } }
package chapter07.D5多态.Detail; public class PolyDetail { public static void main(String[] args) { Animal animal = new Cat(); //animal对象可调用父类所有成员(私有除外),但不能调用子类 //编译类型决定能调用哪些成员,执行类型决定从谁开始向上找方法 animal.run(); //若要调用Cat的catchMouse方法,要向下转型(强转) //语法 子类类型 引用名=(子类类型)父类引用;要求:animal原先是指向子类Cat的,animal转成Dog型就不行,因为原来不指向Dog Cat cat=(Cat)animal;//编译类型为子类Cat,运行类型Cat,相当于生成新的cat对象指向Cat cat.catchMouse(); cat.eat();//能调用子类父类所有方法,优先自己的 } }
package chapter07.D5多态.Detail; public class PolyDetail02 { public static void main(String[] args) { Base base = new Sub(); System.out.println(base.count);//编译类型决定能调用哪些成员,10 Sub sub=new Sub(); System.out.println(sub.count);//20 } } class Base{ int count=10; } class Sub extends Base{ int count=20; }
package chapter07.D5多态.Detail; public class PolyDetail02 { public static void main(String[] args) { Base base = new Sub(); System.out.println(base.count);//编译类型决定能调用哪些成员,10 Sub sub=new Sub(); System.out.println(sub.count);//20 } } class Base{ int count=10; } class Sub extends Base{ int count=20; }
package chapter07.D5多态.Detail; public class PolyDetail02 { public static void main(String[] args) { Base base = new Sub(); System.out.println(base.count);//编译类型决定能调用哪些成员,10 Sub sub=new Sub(); System.out.println(sub.count);//20 } } class Base{ int count=10; } class Sub extends Base{ int count=20; }
package chapter07.D5多态.Detail; public class PolyDetail03 { public static void main(String[] args) { BB bb = new BB(); System.out.println(bb instanceof BB);//判断执行是否属于XX类 System.out.println(bb instanceof AA); AA aa =new BB(); System.out.println(aa instanceof AA); System.out.println(aa instanceof BB); Object obj=new Object(); System.out.println(obj instanceof AA); } } class AA{ } class BB extends AA{ }
package chapter07.D5多态.Detail; public class PolyDetail03 { public static void main(String[] args) { BB bb = new BB(); System.out.println(bb instanceof BB);//判断执行是否属于XX类 System.out.println(bb instanceof AA); AA aa =new BB(); System.out.println(aa instanceof AA); System.out.println(aa instanceof BB); Object obj=new Object(); System.out.println(obj instanceof AA); } } class AA{ } class BB extends AA{ }
package chapter07.D5多态.Detail; public class PolyDetail03 { public static void main(String[] args) { BB bb = new BB(); System.out.println(bb instanceof BB);//判断执行是否属于XX类 System.out.println(bb instanceof AA); AA aa =new BB(); System.out.println(aa instanceof AA); System.out.println(aa instanceof BB); Object obj=new Object(); System.out.println(obj instanceof AA); } } class AA{ } class BB extends AA{ }
动态绑定机制
package chapter07.D5多态.Detail; public class DynamicBinDing { public static void main(String[] args) { A a = new B(); System.out.println(a.sum());//30 只能调用A类里的成员方法,该方法在B类相同的没有,则用A类,A类没有B类有要强转 //两者都有用B类,A有B没有用A类,A没有B有要强转 System.out.println(a.sum1());//20 } } class A{ public int i= 10; public int sum(){ return getl()+10;//回到执行类的方法(动态绑定) } public int sum1(){//属性没有动态绑定,谁有就先用谁 return i+10; } public int getl(){ return i; } } class B extends A{ public int i =20; // public int sum(){ // return i+20; // } public int getl(){ return i; } // public int sum1(){ // return i+10; // } }
package chapter07.D5多态.Detail; public class DynamicBinDing { public static void main(String[] args) { A a = new B(); System.out.println(a.sum());//30 只能调用A类里的成员方法,该方法在B类相同的没有,则用A类,A类没有B类有要强转 //两者都有用B类,A有B没有用A类,A没有B有要强转 System.out.println(a.sum1());//20 } } class A{ public int i= 10; public int sum(){ return getl()+10;//回到执行类的方法(动态绑定) } public int sum1(){//属性没有动态绑定,谁有就先用谁 return i+10; } public int getl(){ return i; } } class B extends A{ public int i =20; // public int sum(){ // return i+20; // } public int getl(){ return i; } // public int sum1(){ // return i+10; // } }
package chapter07.D5多态.Detail; public class DynamicBinDing { public static void main(String[] args) { A a = new B(); System.out.println(a.sum());//30 只能调用A类里的成员方法,该方法在B类相同的没有,则用A类,A类没有B类有要强转 //两者都有用B类,A有B没有用A类,A没有B有要强转 System.out.println(a.sum1());//20 } } class A{ public int i= 10; public int sum(){ return getl()+10;//回到执行类的方法(动态绑定) } public int sum1(){//属性没有动态绑定,谁有就先用谁 return i+10; } public int getl(){ return i; } } class B extends A{ public int i =20; // public int sum(){ // return i+20; // } public int getl(){ return i; } // public int sum1(){ // return i+10; // } }
object类
package chapter07.D5多态.objectpoly; public class Animal { public void cry(){ System.out.println("Animal cry()动物在叫唤"); } }
package chapter07.D5多态.objectpoly; public class Cat extends Animal{ @Override public void cry() { System.out.println("Cat cry() 小猫喵喵叫..."); } }
package chapter07.D5多态.objectpoly; public class Dog extends Animal{ @Override public void cry() { System.out.println("Dog cry() 小狗汪汪叫..."); } }
package chapter07.D5多态.objectpoly; public class PolyObject { public static void main(String[] args) { //多态的特点 Animal animal = new Dog();//编译类型animal(表面) 执行类型dog(实际) animal.cry();//找运行类型 animal=new Cat();//从狗指向猫,执行类型换成狗 animal.cry(); } }
多态数组
package chapter07.D6多态数组; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String say(){ return name+"\t"+age; } public String getName() { return name; } public int getAge() { return age; } }
package chapter07.D6多态数组; public class Student extends Person{ private double score; public Student(String name, int age, double score) { super(name, age); this.score = score; } @Override public String say() { return "学生"+super.say()+"score="+score; } public void study(){ System.out.println("学生"+getName()+"正在学习"); } }
package chapter07.D6多态数组; public class Teacher extends Person{ private double salary; public Teacher(String name, int age, double salary) { super(name, age); this.salary = salary; } @Override public String say() { return "老师"+super.say()+"salary="+salary; } public void teach(){ System.out.println("老师"+getName()+"正在授课"); } }
package chapter07.D6多态数组; public class PloyArray { public static void main(String[] args) { Person[] persons =new Person[5]; persons [0] = new Person("jack", 20); persons [1] = new Student("jack", 21,100); persons [2] = new Student("smith", 22,58); persons [3] = new Teacher("hhh", 26,800); persons [4] = new Teacher("kkk", 27,555); for (int i = 0; i < persons.length ; i++) { System.out.println(persons[i].say());//动态绑定机制 //父没有子有要强转 if (persons[i] instanceof Student){ ((Student)persons[i]).study(); }else if (persons[i] instanceof Teacher){ ((Teacher)persons[i]).teach(); }
多态参数
package chapter07.D7多态参数; public class Employee { public String name; private double salary; public Employee(String name, double salary) { this.name = name; this.salary = salary; } public double getAnnual(){ return 12*salary; } public String getName() { return name; } public double getSalary() { return salary; } }
package chapter07.D7多态参数; public class Manager extends Employee{ private double bonus; public Manager(String name, double salary, double bonus) { super(name, salary); this.bonus = bonus; } public double getBonus() { return bonus; } public void manage(){ System.out.println("经理"+getName()+"\t"+"is managing"); } @Override public double getAnnual() { return super.getAnnual()+bonus; } }
package chapter07.D7多态参数; public class Worker extends Employee{ public Worker(String name, double salary) { super(name, salary); } public void work(){ System.out.println("普通员工"+getName()+"\t"+"is working"); } @Override public double getAnnual() {//因为普通员工没有其他收入,直接调用父类 return super.getAnnual(); } }
package chapter07.D7多态参数; public class Polyparameter { public static void main(String[] args) { Worker tom = new Worker("tom", 2500); Manager milan = new Manager("milan", 5000,200000); Polyparameter polyparameter = new Polyparameter(); polyparameter.showEmpAnnual(tom); polyparameter.showEmpAnnual(milan); polyparameter.testWork(tom); polyparameter.testWork(milan); } public void showEmpAnnual(Employee e){ System.out.println(e.getAnnual()); } public void testWork(Employee e){ if (e instanceof Worker){ ((Worker) e).work();//父类没有子类有 }else if (e instanceof Manager){ ((Manager) e).manage(); } } }