黑马程序员技术交流社区
标题: 黑马程序员------类的终极----抽象类 [打印本页]
作者: 毕延平 时间: 2015-3-8 22:58
标题: 黑马程序员------类的终极----抽象类
http://bbs.itheima.com/thread-3077-1-1.html
(一)抽象类
1、抽象类的概念:
1.如果父类会规定出一些成员方法,需要子类去重写,那么在父类中就可以只定义这个方法,不实现它。这种方法叫:抽象方法。使用一个关键字:abstract
2.抽象方法没有方法体:
abstract void show();//没有大括号,只有方法声明
3.当一个类中包含了一个抽象方法时,那么这个类必须是一个抽象类,仍然使用关键字:abstract修饰;
4.当一个类是抽象类时,说明:
1).此类不能被实例化;就是用来被继承;
2).如果一个类继承了一个抽象类,那么子类必须实现父类中所有的抽象方法;否则子类也必须是个抽象类;也就是:一个抽象类可以继承自另一个抽象类;
3).继承自抽象类仍然使用关键字:extends
4).Java中是单继承,一个类只能同时继承自一个类;抽象类也是一样,一个类也是只能同时继承自一个抽象类;
抽象类反而形成了一种规定:
1.要求所有的人员类,都具有void show()方法,怎么规定呢?
1).定义一个抽象类,里面定义一个抽象方法:abstract void show();
2).要求所有的具体的人员,都继承自那个抽象类,那么在语法上,就必须重写父类的方法;所以这样达到一个所有人员类都具有了void show()方法。
项目经理先定义一个抽象类:
abstract class AbstractService{
abstract void save();//增
abstract void delete();//删
abstract void update();//改
abstract void find();//查
}
要求各小组,所有对数据库操作的类,都必须继承自这个类;
/3、抽象类的特点:
1.一个抽象类中可以不包含抽象方法;
可以包含:成员变量、抽象方法、实现的方法;
2.抽象类不能被实例化:
3.抽象类的子类可以是个抽象类,也可以是个普通类,如果是普通类必须全部实现抽象类中抽象方法;
abstract class Person{
String name;
int age;
Person(){
System.out.println("抽象类Person的构造函数");
}
Person(String name,int age){
this.name = name;
this.age = age;
}
/*
void show(){
System.out.println("大家好,我是好程序班的一员");
}
*/
//把show()做为一个抽象方法
abstract void show();
}
class Student extends Person
{
Student(String name,int age){
super(name,age);//将name和age传给抽象的父类;
}
//重写父类show
void show(){
System.out.println("大家好,我是好程序班的一名学生");
}
}
class Teacher extends Person
{
void show(){
System.out.println("大家好,我是好程序班的一名教师");
}
}
class Demo
{
public static void main(String[] args)
{
Student stu = new Student();
stu.show();//大家好,我是好程序班的一员
Teacher tea = new Teacher();
tea.show();//大家好,我是好程序班的一员
}
}
3、abstract不能和哪些关键字共存:
1.private:
一个abstract方法就是用来被子类重写的,所以子类必须能访问父类的抽象方法,所以父类的抽象方法不能是private;
2.final:
一个abstract方法是用来被子类重写的,被声明为final的方法是最终方法,不允许重写。所以冲突;一个abstract类是用来被继承的,被声明为final的类是最终类,不能被继承。所以冲突;
3.static:
一个abstract方法没有方法体。而一个static的方法在第一次使用类的时候就会被分配空间,而此时,抽象类的方法没有方法体,所以也就无法为其分配空间。所以不能是abstract又是static的.
4、使用抽象类作为方法形参:
1.一个方法的形参可以接收一个抽象类类型的;
2.此方法接收一定要是抽象类的子类对象的引用;因为抽象类本身不能被实例化;
3.到方法体内,实际上就是一种多态的表现形式。父类的引用指向子类的对象;
了解一下事情:
1.抽象类类型可以作为方法形参;
2.当传递实参时,传递的一定要是抽象类的子类的对象的引用;
3.在方法内部,实际上就是父类的引用指向了子类的对象。实际就是多态的形式
abstract class AbstractA
{
void show();
}
class SubA extends AbstractA
{
void show(){
System.out.println("show()");
}
}
class SubB extends AbstractA
{
void show(){
System.out.println("SubB-->show()");
}
}
class C
{
}
class B
{
void print(AbstractA aObj){//0x7788 多态的形式。父类的引用指向之类对象
aObj.show();
// 0x7788.show();
}
}
class Demo
{
public static void main(String[] args)
{
B b = new B();
SubA aObj = new SubA();//0x7788
b.print(aObj);//0x7788
SubB aObj2 = new SubB();
b.print(aObj2);
C c = new C();
// b.print(c);//编译错误。C不是AbstractA的子类;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |