重走Java基础:面向对象-抽象类(abstract)

抽象类,什么是抽象类?

1. 抽象类的产生

当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。

但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?**

分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法**功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。**

比如:
描述JavaEE工程师:行为:工作。
描述Android工程师:行为:工作。

**JavaEE工程师和Android工程师之间有共性,可以进行向上抽取。**抽取它们的所属共性类型:研发部员工。由于JavaEE工程师和Android工程师都具有工作功能,但是他们具体工作内容却不一样。这时在描述研发部员工时,发现了有些功能(工作)不具体,这些不具体的功能,需要在类中标识出来,通过java中的关键字abstract(抽象)。

当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。

2. 抽象类&抽象方法的定义

抽象方法定义的格式:

	public abstract 返回值类型 方法名(参数);

看如下代码:

//研发部员工 
abstract class Developer {
	public abstract void work();//抽象函数。需要abstract修饰,并分号;结束
}

//JavaEE工程师
class JavaEE extends Developer{
	public void work() {
		System.out.println("正在研发淘宝网站");
	}
}

//Android工程师
class Android extends Developer {
	public void work() {
		System.out.println("正在研发淘宝手机客户端软件");
	}
}

3.抽象类的特点

看以下代码:

Develop类
/*
 *  定义类开发工程师类
 *    EE开发工程师 :  工作
 *    Android开发工程师 : 工作
 *    
 *    根据共性进行抽取,然后形成一个父类Develop
 *    定义方法,工作: 怎么工作,具体干什么呀
 *    
 *    抽象类,不能实例化对象, 不能new的
 *    不能创建对象的原因:  如果真的让你new了, 对象.调用抽象方法,抽象方法没有主体,根本就不能运行
 *    抽象类使用: 定义类继承抽象类,将抽象方法进行重写,创建子类的对象
 */
public abstract class Develop {
   //定义方法工作方法,但是怎么工作,说不清楚了,讲不明白
	//就不说, 方法没有主体的方法,必须使用关键字abstract修饰
	//抽象的方法,必须存在于抽象的类中,类也必须用abstract修饰
	public abstract void work();
}
JavaEE类
/*
 *  定义类,JavaEE的开发人员
 *  继承抽象类Develop,重写抽象的方法
 */
public class JavaEE extends Develop{
	//重写父类的抽象方法
	//去掉abstract修饰符,加上方法主体
	public void work(){
		System.out.println("JavaEE工程师在开发B/S 软件");
	
	}
}
Android类
/*
 *  定义Android类,继承开发人员类
 *  重写抽象方法
 */
public class Android extends Develop{
     public void work(){
    	 System.out.println("Android工程师开发手机软件");
     }
}
Test测试类
/*
 *  测试抽象类
 *    创建他的子类的对象,使用子类的对象调用方法
 */
public class Test {
	public static void main(String[] args) {
		 JavaEE ee = new JavaEE();
		 ee.work();
		 
		 Android and = new Android();
		 and.work();
	}
}

  1. 抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
  2. 抽象方法只能有声明;没有大括号囊括的
  3. 抽象类不可以直接创建对象,原因:调用抽象方法没有意义。
  4. 抽象类的使用必须通过子类来使用,并且只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类,因为子类继承了所有父类属性和方法,如果子类里不将父类的所有抽象方法重写,那么子类里还存在从父类继承过来的抽象方法,因此子类存在抽象方法,所有子类也应该是抽象类。无法new一个子类实例。
    在这里插入图片描述
  5. 设计思想: 之所以继承抽象类,更多的是在思想,是面对共性类型操作会更简单。抽象类的作用:继承体系。抽象类,强制子类重写抽象方法。

4. 抽象类的细节问题

  1. 抽象类一定是个父类?
    是的,因为不断抽取而来的。
  2. 抽象类中是否可以不定义抽象方法。
    是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用。
/*
 *   抽象类,可以没有抽象方法,可以定义带有方法体的方法
 *   让子类继承后,可以直接使用
 */
public  abstract class Animal {
     public void sleep(){
    	 System.out.println("动物睡觉");
     }
     
    // private abstract void show();
     //抽象方法,需要子类重写, 如果父类方法是私有的,子类继承不了,也就没有了重写
}

public class Cat extends Animal{

}

public class Test {
	public static void main(String[] args) {
		//Cat c = new Cat();
		new Cat().sleep();
	}
}


  1. 抽象关键字abstract不可以和哪些关键字共存?
    1. private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。
    1. final
    1. static

猜你喜欢

转载自blog.csdn.net/qq_38337799/article/details/84137871
今日推荐