目录
2 抽象类
2.1 抽象类-产生
有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
描述JavaEE工程师:行为:工作。
描述Android工程师:行为:工作。
JavaEE工程师和Android工程师之间有共性,可以进行向上抽取。抽取它们的所属共性类型:研发部员工。由于JavaEE工程师和Android工程师都具有工作功能,但是他们具体工作内容却不一样。这时在描述研发部员工时,发现了有些功能(工作)不具体,这些不具体的功能,需要在类中标识出来,通过java中的关键字abstract(抽象)。
当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。
2.2 抽象类&抽象方法的定义
抽象方法定义的格式:
public abstract 返回值类型 方法名(参数);
抽象类定义的格式:
abstract class 类名 {
}
* 抽象类,不能实例化对象, 不能new的
* 不能创建对象的原因: 如果真的让你new了, 对象.调用抽象方法,抽象方法没有主体,根本就不能运行
* 抽象类使用: 定义类继承抽象类,将抽象方法进行重写,创建子类的对象
2.3 抽象类的特点:
1、抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
2、抽象类不可以直接创建对象,原因:调用抽象方法没有意义。
3、只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类。
之所以继承抽象类,更多的是在思想,是面对共性类型操作会更简单。
2.4 抽象类的细节问题:
1、抽象类一定是个父类?
是的,因为不断抽取而来的。
2、抽象类中是否可以不定义抽象方法。
是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用
注意:
(1) 父类定义抽象类,可以定义抽象类方法(都需要被abstract修饰),抽象类方法没有主体。
子类JavaEE继承抽象类Develop,重写抽象的方法,重写父类的抽象方法,去掉abstract修饰符,加上方法主体。
//Develop.java
package cn.itcast.demo06;
/*
* 定义类开发工程师类
* EE开发工程师 : 工作
* Android开发工程师 : 工作
*
* 根据共性进行抽取,然后形成一个父类Develop
* 定义方法,工作: 怎么工作,具体干什么呀
*
* 抽象类,不能实例化对象, 不能new的
* 不能创建对象的原因: 如果真的让你new了, 对象.调用抽象方法,抽象方法没有主体,根本就不能运行
* 抽象类使用: 定义类继承抽象类,将抽象方法进行重写,创建子类的对象
*/
public abstract class Develop {
//定义方法工作方法,但是怎么工作,说不清楚了,讲不明白
//就不说, 方法没有主体的方法,必须使用关键字abstract修饰
//抽象的方法,必须存在于抽象的类中,类也必须用abstract修饰
public abstract void work();
}
//JavaEE.java
package cn.itcast.demo06;
/*
* 定义类,JavaEE的开发人员
* 继承抽象类Develop,重写抽象的方法
*/
public class JavaEE extends Develop{
//重写父类的抽象方法
//去掉abstract修饰符,加上方法主体
public void work(){
System.out.println("JavaEE工程师在开发B/S软件");
}
}
//android.java
package cn.itcast.demo06;
/*
* 定义Android类,继承开发人员类
* 重写抽象方法
*/
public class Android extends Develop{
public void work(){
System.out.println("Android工程师开发手机软件");
}
}
//Test.java
package cn.itcast.demo06;
/*
* 测试抽象类
* 创建他的子类的对象,使用子类的对象调用方法
*/
public class Test {
public static void main(String[] args) {
JavaEE ee = new JavaEE();
ee.work();
Android and = new Android();
and.work();
}
}
(2) 或者抽象类可以没有抽象方法,可以定义带有方法体的方法,让子类继承后,可以直接使用抽象类的方法.
//Animal.java
package cn.itcast.demo07;
public abstract class Animal {
public void sleep(){
System.out.println("动物睡觉");
}
// private abstract void show();
//抽象方法,需要子类重写, 如果父类方法是私有的,子类继承不了,也就没有了重写
}
//Cat.java
package cn.itcast.demo07;
public class Cat extends Animal{
}
//Test.java
package cn.itcast.demo07;
public class Test {
public static void main(String[] args) {
//Cat c = new Cat();
new Cat().sleep();
}
}
3 抽象关键字abstract不可以和哪些关键字共存?
1、private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。
目的是为了重写。
2、final
3、static
总结:
- 抽象方法: 方法只有声明部分,没有方法体
- 抽象类: 包含抽象方法的类,一定是抽象类
使用 abstract 修饰的类,是抽象类
- 抽象类的特点:
1,抽象类与抽象方法都必须使用 abstract来修饰
2,抽象类不能直接创建对象
3,抽象类中可以有抽象方法,也可以没有抽象方法
4,抽象类的子类
a,实现了抽象方法的具体类
b,抽象类
- 抽象类面试题:
1,抽象类中是否可以没有抽象方法?如果可以,那么,该类还定义成抽象类有意义吗?为什么?
答:可以没有抽象方法,有意义,不会让其他人直接创建该类对象