抽象類(lèi):
抽象:籠統(tǒng),模糊,看不懂!不具體。
特點(diǎn):
1,方法只有聲明沒(méi)有實(shí)現(xiàn)時(shí),該方法就是抽象方法,需要被abstract修飾。
抽象方法必須定義在抽象類(lèi)中。該類(lèi)必須也被abstract修飾。
2,抽象類(lèi)不可以被實(shí)例化。為什么?因?yàn)檎{(diào)用抽象方法沒(méi)意義。
3,抽象類(lèi)必須有其子類(lèi)覆蓋了所有的抽象方法后,該子類(lèi)才可以實(shí)例化。
否則,這個(gè)子類(lèi)還是抽象類(lèi)。
抽象類(lèi)的細(xì)節(jié)描述:
1,抽象類(lèi)中有構(gòu)造函數(shù)嗎?
有,用于給子類(lèi)對(duì)象進(jìn)行初始化。
2,抽象類(lèi)可以不定義抽象方法嗎?
可以的。 但是很少見(jiàn),目的就是不讓該類(lèi)創(chuàng)建對(duì)象。AWT的適配器對(duì)象就是這種類(lèi)。
通常這個(gè)類(lèi)中的方法有方法體,但是卻沒(méi)有內(nèi)容。
abstract class Demo
{
void show1()
{}
void show2()
{}
}
3,抽象關(guān)鍵字不可以和那些關(guān)鍵字共存?
private 不行
static 不行
final 不行
4,抽象類(lèi)和一般類(lèi)的異同點(diǎn)。
相同點(diǎn):
抽象類(lèi)和一般類(lèi)都是用來(lái)描述事物的,都在內(nèi)部定了成員。
不同:
1,一般類(lèi)有足夠的信息描述事物。
抽象類(lèi)描述事物的信息有可能不足。
2,一般類(lèi)中不能定義抽象方法,只能定非抽象方法。
抽象類(lèi)中可定義抽象方法,同時(shí)也可以定義非抽象方法。
3,一般類(lèi)可以被實(shí)例化。
抽象類(lèi)不可以被實(shí)例化。
5,抽象類(lèi)一定是個(gè)父類(lèi)嗎?
是的。因?yàn)樾枰宇?lèi)覆蓋其方法后才可以對(duì)子類(lèi)實(shí)例化。
/*
雇員示例:
需求:公司中程序員有姓名,工號(hào),薪水,工作內(nèi)容。
項(xiàng)目經(jīng)理除了有姓名,工號(hào),薪水,還有獎(jiǎng)金,工作內(nèi)容。
對(duì)給出需求進(jìn)行數(shù)據(jù)建模。
分析:
在這個(gè)問(wèn)題領(lǐng)域中,先找出涉及的對(duì)象。
通過(guò)名詞提煉法。
程序員:
屬性:姓名,工號(hào),薪水、
行為:工作。
經(jīng)理:
屬性:姓名,工號(hào),薪水,獎(jiǎng)金。
行為:工作。
程序員和經(jīng)理不存在著直接繼承關(guān)系,
但是程序員和經(jīng)理卻具有共性內(nèi)容。
可以進(jìn)行抽取。因?yàn)樗麄兌际枪镜墓蛦T
可以將程序員和經(jīng)理進(jìn)行抽取.建立體系.
*/
//描述雇員。
abstract class Employee
{
private String name;
private String id;
private double pay;
Employee(String name,String id,double pay)
{
this.name = name;
this.id = id;
this.pay = pay;
}
public abstract void work();
}
//描述程序員。
class Programmer extends Employee
{
Programmer(String name,String id,double pay)
{
super(name,id,pay);
}
public void work()
{
System.out.println("code...");
}
}
//描述經(jīng)理。
class Manager extends Employee
{
private int bonus;
Manager(String name,String id,double pay,int bonus)
{
super(name,id,pay);
this.bonus = bonus;
}
public void work()
{
System.out.println("manage");
}
}
class AbstractTest
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
//舉例
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
class Student extends Person
{
Student(String name,int age)
{
super(name,age);
}
}
class Worker extends Person
{
Worker(String name,int age)
{
super(name,age);
}
}