多态:一个对象变量可以指向多种实际类型的现象。 7.3.1. 方法的覆盖(overridding) 当子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。(注意返回值类型也必须相同,否则编译出错。) 如果方法参数表不同,则成重载。 特点: 1.对于方法的访问限制修饰词,子类方法要比父类的访问权限更高。 父类为public,那么子类为private则出现错误。 2.子类抛出的异常应该是父类抛出的异常或其子类。 7.3.2. 多态的分类 多态分两种: 1编译时多态:编译时动态重载; 2运行时多态:指一个对象可以具有多个类型,方法的覆盖 这样对于对象而言分为: 理解运行时多态: Car c = new Bus(); Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法 Bus运行时类型 实际运行是访问heep中的对象,调用实际的方法。 运行时多态是由运行时类型决定的 编译时多态是由编译时类型决定的 猫,小鸟,狗 都是动物,都可以安上动物的标签。 Interface Animal{} Class Car implements Animal{} Class Bird implements Animal{} Class Dog implements Animal{} 方法中 Animal a = new Car(); Animal b = new Bird(); Animal c = new Dog();*方法重载看的是参数的编译时类型public class Animal{ public static void main(String[] args){ } } (1) 是覆盖吗?不能多态了 abstract class MyClass{ priavate void m(); } class Sub extends MyClass(){ public void m(); } (2) 错误的修饰符组合 abstract class MyClass{ priavate abstract void m(); } class Sub extends MyClass(){ public void m(); } (3) 5.0 新 非覆盖 abstract class MyClass{ private final void m(); } class Sub extends MyClass(){ public void m(); }
7.3.1. 方法的覆盖(overridding)
当子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。(注意返回值类型也必须相同,否则编译出错。)
如果方法参数表不同,则成重载。
特点:
1.对于方法的访问限制修饰词,子类方法要比父类的访问权限更高。
父类为public,那么子类为private则出现错误。
2.子类抛出的异常应该是父类抛出的异常或其子类。
7.3.2. 多态的分类
多态分两种:
1编译时多态:编译时动态重载;
2运行时多态:指一个对象可以具有多个类型,方法的覆盖
这样对于对象而言分为:
理解运行时多态:
Car c = new Bus();
Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法
Bus运行时类型 实际运行是访问heep中的对象,调用实际的方法。
运行时多态是由运行时类型决定的
编译时多态是由编译时类型决定的
猫,小鸟,狗 都是动物,都可以安上动物的标签。
Interface Animal{}
Class Car implements Animal{}
Class Bird implements Animal{}
Class Dog implements Animal{}
方法中
Animal a = new Car();
Animal b = new Bird();
Animal c = new Dog();*方法重载看的是参数的编译时类型public class Animal{
public static void main(String[] args){ }
}
(1) 是覆盖吗?不能多态了
abstract class MyClass{
priavate void m();
}
class Sub extends MyClass(){
public void m();
}
(2) 错误的修饰符组合
abstract class MyClass{
priavate abstract void m();
}
class Sub extends MyClass(){
public void m();
}
(3) 5.0 新 非覆盖
abstract class MyClass{
private final void m();
}
class Sub extends MyClass(){
public void m();
}
//1.如果一个子类对象当做父类对象来看,子类对象只能调用父类对象
//2.如果一个子类对象当做父类对象来看,调用的方法在子类中得到了重写,那么子类对象只能调用自己类的这个方法
public class CsdnTest {
public static void main(String[] args) {
Client c1=new VIPClient("zhangsan",26);//这里体现多态.把VIP顾客当做一个顾客来看,但是调用BUY方法时一定会调用它自己的BUY方法,这就是多态
Client c2=new CommonClient("lisi",53);
c1.buy();
c2.buy();
}
}class Client { // 顾客的父类
private String name;
private int age; public Client(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public void buy(){
}
}class VIPClient extends Client { // VIP顾客 继承顾客类 public VIPClient(String name, int age) {
super(name, age);
} @Override
public void buy() {
System.out.println("VIP顾客购物打八折");
}}class CommonClient extends Client { public CommonClient(String name, int age) {
super(name, age);
} @Override
public void buy() {
System.out.println("普通顾客不打折!");
}}