面向对象 3-抽象类 abstract,接口,多态

抽象类
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. 多态:同一个类型,因为指向不同的子类对象,而执行不同的操作。
    (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();
}

猜你喜欢

转载自blog.csdn.net/weixin_43905026/article/details/88119719
今日推荐