抽象类
1.抽象: 在满足is-a,并且满足抽象的适用场景,才用抽象。
(1)关键字:abstract
(2)适用场景:a.如果一个父类,它的实例New出来后,没有任何意义,咱们就可以将这个父类定为抽象类。
b.不一个父类公有的方法声明时,无法确定这个方法体的具体实践时,就可以把这个方法定为抽象方法。抽象方法必须定义在抽象类中。
(3)抽象类:不可以被实例化
语法:
public abstract class 类名 {
}
(4)抽象方法:a.抽象方法没有方法体。b.抽象方法必须写在抽象类中。c.抽象类中的抽象方法要让子类去实现。如果子类也是一个抽象类,可以不实现这个抽象方法,但是要让子类的下代子类去实现抽象方法。
public abstract 方法的返回值 方法名(参数列表) ;
eg:父类中:
/**
* 叫
*/
public abstract void bar() ;
子类中:
/**
* 叫
*/
@Override
public void bar(){
System.out.println("喵喵");
}
注:(1)抽象方法一定被子类重写(强制性要求子类重写)。父类中一般的方法,子类可以重写也可以不重写。
(2)抽象类中可以有抽象方法,也可以没有抽象方法,也可以有普通方法。
例子
/**
- 跑的能力
- @author sx
/
public interface Run {
/*
* 接口中的变量,会默认被 public static final 常量要大写
*/
public static final int NUM=1;
/**
* 接口中的抽象方法 ,这个方法默认被 public abstract 修饰
*/
void run1();
}
2.接口:(interface)当一个类中所有方法都是抽象方法,并且类中的变量全是静态常量时,那么这个类就叫接口。
(1)接口:表示是一种能力,约定。子类具有某种能力,约定。has a;
(2)好处:提高代码的扩展性。
(3)接口的语法:接口名与类名的命名规则一样。
public interface 接口名{
}
注:a.接口中的方法都会默认加上public abstact来修饰,接口中的方法都是抽象方法。
eg:接口中方法的声明: 返回值类型 方法名(参数列表);
b.接口中的变量都会默认加上public static final来修饰,接口中的变量都是静态常量。
eg:接口中静态常量的声明: 数据类型 常量名;
c.子类可以用(implements)实现接口。
语法:public class 类名 【extends 父类】 implements 接口1【,接口1】{ }
d.一个类可以实现多个接口。
e.接口可以继承1到多个接口。
语法:public interface 接口1 extends 接口2【,接口3】{ };
f.接口意义:java支持单继承多实现(一个类只可以直接继承一个类,但是可以实现多个接口)。所以接口可以在某种情况下补充Java中单继承的问题。
g.接口是一种特殊抽象类,接口不能实例化。
练习:诺基亚手机:接电话,打电话。
摩托罗拉手机: 接电话,打电话,发短信,发彩信。
OPP手机: 接电话,打电话,发短信,发彩信,听歌。
苹果手机:接电话,打电话,发短信,发彩信,听歌,上网,看视频。
- 多态:同一个类型,因为指向不同的子类对象,而执行不同的操作。
(1)前提条件:a.有继承的存在。b.子类重写父类方法。c.用父类作为类型,指向的是子类对象。
(2)好处:a.提高程序的可扩展性。b.提高了程序可维护性。
(3)多态的使用:常用场景
a.用父类作为类型,New一个子类对象。
b.用父类作为方法形参,用子类对象作为方法的实参。
(4)多态中的父类类型可以是自声明一个父类,也声明的一个接口。
注:自定义的类,接口都是一种数据类型。
4.(1)向上转型:把子类转换成父类,自动类型转换。
用父类类型指向的子类对象的实例,只能调用父类中继承过来的属性和方法,不能调用子类独有的方法
eg:Pet p1=new Dog();
p1.name=“大发2”;
p1.eat();
(2)向下转型:把父类转换成子类本来的面目。强制类型转换。
eg:Dog dd=(Dog)p1;
dd.look();
(3)对象转换的判断 instanceof
if(p1 instanceof Dog){
Dog dd=(Dog)p1;
dd.look();
}else if(p1 instanceof Cat){
Cat dd=(Cat)p1;
dd.pa();
}