java抽象类与抽象方法详解+练习题

抽象类与抽象方法

一、为什么使用抽象方法和抽象类
请添加图片描述

二、抽象方法
抽象方法指一些只有方法声明,而没有具体方法体的方法。

结构
abstract class 类名称 // 定义抽象类
{
    
    
    声明数据成员;
    访问权限 返回值的数据类型 方法名称(参数...//定义一般方法
    {
    
    
        ...
    }
    abstract 返回值的数据类型 方法名称(参数...;
    //定义抽象方法,在抽象方法里,没有定义方法体
}
**注意:**

普通方法必须要有方法体,抽象方法不能有方法体(大括号也没有)
抽象方法要用abstract修饰
抽象方法没有方法体,直接以分号结束。
public abstract void shout();
public abstract void eat();

三、抽象类
概念:包含抽象方法的类称为抽象类。抽象类为子类提供一个规范。目的是让子类继承(extends)。
结构:修饰符 abstract class 类名{}
可以定义:普通变量,抽象方法,构造方法,普通方法
注意:
若没有子类继承extends,则这种规范没有任何意义。
抽象类的定义方式关键字abstract
如果一个类包含抽象方法,那么该类必须是抽象类。

举例:public abstract class Animal {}
抽象方法shout eat

四、抽象方法的实现
抽象方法必须靠继承extends可以实现,继承抽象类的子类必须重写父类所有的抽象方法,否则,该子类也必须声明为抽象类。
关键字:extends
举例01:(1)定义一个抽象类Animal,包含name、age属性,
一个普通方法toString() 有一个抽象方法shout() 、 eat(),普通方法sleep() 、play()
(2)定义一个Dog类继承抽象类Animal,并且实现抽象方法
(3)定义一个Cat类继承抽象类Animal,并且实现抽象方法
(4)定义一个Tiger类继承抽象类Animal,并且实现抽象方法
(5)定义一个Goat类继承抽象类Animal,并且实现抽象方法
(6)定义一个测试类创建以上几种动物,并打印输出

五、注意
抽象类的使用原则 如下:
抽象方法必须为public 或者protected,抽象类默认为public的定义方式关键字abstract
抽象方法不能直接实例化,需要依靠子类使用关键字extends继承
一个子类只能继承一个抽象类
子类如果不是抽象类,必须重写抽象类中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为抽象类)
抽象类不能使用final关键字,因为抽象类必须有子类,而final定义的类不能有子类

六、总结
1.抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。
2.只有抽象类的非抽象子类才可以创建对象
3.抽象类中不一定包含抽象方法,但是有抽象方法的类必须定义为抽象类
4.抽象类中的抽象方法只是声明,不包含方法体。
5.抽象类的子类必须给出抽象类中抽象方法的具体实现,除非子类也是抽象类。
七.练习题

请添加图片描述

package case5;

public class abstractTest {
    
    
	public static void main(String[] args) {
    
    
		/********* begin *********/
		// 分别实例化Student类与Worker类的对象,并调用各自构造方法初始化类属性。
		Student s=new Student("张三",20,"学生");
        Worker w=new Worker("李四",30,"工人");
        System.out.println( s.talk());
        System.out.println( w.talk());
		// 分别调用各自类中被复写的talk()方法 打印信息。
		
		/********* end *********/
		
	}
}

// 声明一个名为Person的抽象类,在Person中声明了三个属性name age occupation和一个抽象方法——talk()。
abstract class Person {
    
    
	/********* begin *********/
String name;
int age;
String occupation;
abstract String talk();	/********* end *********/
}

// Student类继承自Person类,添加带三个参数的构造方法,复写talk()方法 返回姓名、年龄和职业信息
class Student extends Person {
    
    
	/********* begin *********/
// public Student(){
    
    

// }
public Student(String name,int age,String occupation){
    
    
   this.name=name;
   this.age=age;
   this.occupation=occupation;
}
 String talk(){
    
    
    return "学生——>姓名:"+name+",年龄:"+age+",职业:"+occupation+"!";
}
	/********* end *********/
}

// Worker类继承自Person类,添加带三个参数的构造方法,复写talk()方法 返回姓名、年龄和职业信息
class Worker extends Person {
    
    
	/********* begin *********/
// public Worker(){
    
    

// }
public Worker(String name,int age,String occupation){
    
    
   this.name=name;
   this.age=age;
   this.occupation=occupation;
}
 String talk(){
    
    
     return "工人——>姓名:"+name+",年龄:"+age+",职业:"+occupation+"!";
}
	/********* end *********/

}

请添加图片描述

猜你喜欢

转载自blog.csdn.net/weixin_54107527/article/details/121581393