1、重写与重载的区别
方法重写 | 方法重载 |
---|---|
同一个类 | 子类重写父类的方法 |
方法名相同 | 方法名相同 |
参数列表不同 | 参数列表相同 |
与返回值和修饰符无关 | 返回值相同或是其子类,修饰符不能比父类更严格 |
2、多态
2.1多态的概念
什么是多态:多种形态。
分两部分:
1、功能多态:一个行为多种实现方式 体现:重写和重载
2、形态多态:一个类型的多种表现形式比如:动物多种表现形式:猫、狗
Animal a=new Dog();//父类的引用指向子类的对象(即向上转型),反过来不行
多态的2种实现方式:
1.将父类的类型作为方法的形参 在调用方法时给他传递具体的子类对象
2.将父类作为方法的返回值类型来实现多态(计算器(工厂模式))
2.2多态的应用
1、向上转型:父类引用指向子类对象
2、向下转型:父类引用显式类型转换为子类对象。
创建人类作为父类 婴儿,小学生,高中生,成年人作为子类
使用多态来描述睡觉的方法
public abstract class People {
public abstract void sleeping() ;
}
public class Baby extends People {
@Override
public void sleeping() {
System.out.println("抱着唱着世上只有妈妈好睡觉...");
}
}
public class Pupil extends People {
@Override
public void sleeping() {
System.out.println("吱吱吱,睡觉的时候在磨牙....");
}
}
public class Test {
public static void main(String[] args) {
People babay=new Baby();
babay.sleeping();
People pupil=new Pupil();
pupil.sleeping();
}
}
2.3 父类作为返回值
/**
* 买宠物
* @param choose
* @return
*/
public Animal buy(int choose){
Animal animal=null;
switch (choose) {
case 1:
animal=new Dog();
break;
case 2:
animal=new Cat();
break;
case 3:
animal=new Pig();
break;
default:
break;
}
return animal;
}
2.4 父类作为参数传递
/**
* 玩耍
*/
public void play(Animal a){//向下转型,一般与instanceOf结合使用,调用子类特有的属性和行为
/*if(a==null){
return;
}*/
if(a instanceof Dog){
((Dog)a).eat();
}else if(a instanceof Cat){
((Cat)a).sleep();
}else if(a instanceof Pig){
((Pig)a).run();
}
}
2.5 Instanceof运算符的应用
作用:用来判断对象的类型。
Public class Demo{
Public static void main(String[] args){
//不能用子类引用指向父类对象
//编译期错误
//运行期错误
//向下转型
Cat c=(Cat)c1;
//先判断一下要转换的类型是否是目标类型,如果是,再强制类型转换
if(d1 instanceof Cat){//instanceof用来判断对象类型,返回值true表示类型一致,false表示类型不一致
Cat c2=(Cat)d1;
}
}
}
3、接口
3.1 接口的概述
接口:接口就是一组功能(能力/规范)
特点:
1、实现多态
2、解决了继承的单一继承的问题。
注意事项:
1、多组合,帮助程序功能与功能之间解耦,程序的扩展性好、维护性好
2、接口侧重能力,忽略实现细节
3、面向接口编程,一个接口可以同时继承多个接口
接口实现了多继承性
当一个类需要继承多个父类的时候
XX是XX 就用继承 XX具备XX的某种功能就用接口
如果一个类只有一个父类 优先使用接口()
接口 里面的方法全是抽象方法 方法的修饰符默认都是public
里面的变量都是静态常量(不需要加修饰符)
一个类是定义成接口还是抽象类呢?
如果一个类中的方法全是抽象方法 变量都是静态常量 定义为接口