java--抽象类

一、概念

抽象方法:被abstract修饰的方法;

抽象类:被abstract修饰的类,抽象类就是模糊的,看不清的,该类中所有的方法不足以描述一个具体的事物,并且所有继承于该类的子类都必须有继承的抽象类中的抽象方法。继承抽象类的子类,必须完成父类中的去全部抽象方法,该抽象方法没有确定的功能,在子类中完成具体的功能。比如我们定义一个抽象类--学生,要求学生必须学习,那么就相当于我们在学生这个抽象类中有一个抽象方法--学习,所有继承于学生的类都必须有学习的这个方法,至于具体不同的学生学习的内容,这个就是不确定的,在继承学生类的子类中,就可以对学习方法做具体的说明。

二、注意点

抽象类的使用注意点如下:

1.  抽象方法一定在抽象类中;

2.  抽象方法和抽象类都必须用 abstract关键字修饰;

3.  抽象类不可以用new创建对象 抽象类无法实例化;

4.  抽象类中的方法想要被使用 ,必须由子类重写其所有抽象方法;

5.  一个抽象类中可以包含抽象方法和非抽象方法 ,但如果一个方法被抽象修饰,它所在的类必须是抽象的,抽象类可以不定义抽象方法;

6.  抽象类中有构造函数,但是由于“抽象”对类的限定,使得这个抽象修饰的类无法创建对象;

7.  abstract只是一个修饰符,在定义的抽象类中如果没有抽象方法,那么,这样定义只是为了不让该类实例化。

8.  如果一个普通子类继承了一个抽象子类,该抽象子类又继承一个抽象的父类,那么该普通子类必须得重写抽象父类中所有的抽象方法,如果在抽象子类已重写过的抽象方法 ,普通子类就不需要重写了;

三、实例测试

1.定义一个抽象类

//定义一个学生类(抽象)
abstract class Student
{
	abstract void study();//定义一个抽象方法
	void eat(){//定义一个普通方法
		System.out.println("eat");
	}
}   

如果此时直接实例化该类如下:

class Demo_1 
{
	public static void main(String[] args) 
	{
		Student s = new Student();//实例化
	}
}
此时的运行结果如下:


由此验证注意点3,因为Student为抽象类,所以无法对其进行实例化。

2. 子类对于抽象类中方法的重写

在学生类中创建两个抽象类方法,对于重新创建一个类继承于学生类,如下代码:

//定义一个学生类(抽象)
abstract class Student
{
	abstract void study();//定义一个抽象方法
	abstract void mathod();
	void eat(){//定义一个普通方法
		System.out.println("eat");
	}
}
class VRStudent extends Student//定义一个类继承于学生
{
	//重写抽象方法study();
	void study(){
		System.out.println("VR");
	}
	//重写抽象方法mathod();
	void mathod(){
		System.out.println("VRStudent_mathod");
	}
} 
class Demo_1 
{
	public static void main(String[] args) 
	{
		VRStudent v = new VRStudent();//实例化类
		v.study();//调用对象方法
		v.mathod();
		v.eat();
	}
}
运行结果如下:


在Student类中,有普通方法和抽象方法,VRStudent继承于Student类,并在该类中重写了学生类中的所有抽象方法,实例化该类之后,调用输出不会报错,从结果中也能

看出,在抽象类中非抽象的成员可以不用在子类中重写,可以直接使用。

那么如果没有将抽象类全部重写,如下:

//定义一个学生类(抽象)
abstract class Student
{
	abstract void study();//定义一个抽象方法
	abstract void mathod();
	void eat(){//定义一个普通方法
		System.out.println("eat");
	}
}
class JavaStudent extends Student
{
	void study(){
		System.out.println("java");
	}
}
class Demo_1 
{
	public static void main(String[] args) 
	{
		JavaStudent J = new JavaStudent();
		J.study();
	}
}
运行结果如下:


 建立子类对象调用,如果只重写其中一部分方法,子类就会继承父类的抽象方法, 那么子类也是个抽象类,就必须对子类也添加abstract修饰符。

3. 关于多层继承

abstract class Student
{
	private String name;
	public Student(){
		super();
	}
	public Student(String name){
		super();
		this.name = name;
	}
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public abstract void study();
	public abstract void method();
}
//继承于学生类 重写所有抽象方法
class MiddleStudent extends Student
{
	public void study(){
	
	}
	public void method(){
	
	}
}
//继承学生类 重写其中一个方法,相当于本类也是抽象类,要添加abstract修饰符
abstract class ColleageStudent extends Student
{
	public void method(){
	
	}//重写一个方法
}
//继承于ColleageStudent类
class LittleStudent extends ColleageStudent
{
	//重写另一个方法,在ColleageStudent中重写了一个抽象方法,在本类中就只用重写一个了
	public void study(){
	
	}
}
class Demo_1 
{
	public static void main(String[] args) 
	{
		LittleStudent J = new LittleStudent();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,类与继承-抽象类有以下几个关键点。首先,继承是指一个类可以继承自另一个类。被继承的类被称为父类/超类/基类,而继承其他类的类被称为子类。继承使得子类可以拥有父类中所有的成员(成员变量和成员方法),从而提高了代码的复用性。 其次,当子类继承自一个抽象类时,子类必须重写父类所有的抽象方法,否则该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则从最初的父类到最终的子类都不能创建对象,失去了继承的意义。 一个示例代码如下: ``` public abstract class Animal { public abstract void run(); } public class Cat extends Animal { public void run() { System.out.println("小猫在墙头走~~~"); } } public class CatTest { public static void main(String[] args) { Cat c = new Cat(); c.run(); } } ``` 在上述代码中,Animal是一个抽象类,其中定义了一个抽象方法run。Cat类继承自Animal类,并且重写了run方法。在CatTest类的main方法中,创建了一个Cat对象并调用了run方法。 更多关于Java类与继承-抽象类的知识,可以参考Java基础教程之接口的继承与抽象类。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java面向对象基础——继承、抽象类](https://blog.csdn.net/qq_42538127/article/details/115426682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【JavaSe】面向对象篇(六) 抽象类](https://blog.csdn.net/qq_41744145/article/details/100023046)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java基础教程之接口的继承与抽象类](https://download.csdn.net/download/weixin_38516270/12808613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值