Java抽象类与接口

一. 认识抽象类

1. 简介

假设要编写一个计算圆、三角形和矩形的面积与周长的程序。若按照前面所学的方式编程,就必须定义3个类:圆类、三角形类、矩形类,它们之间没有继承关系。程序写好之后虽然能执行,但从代码的整体结构来看,前面三个类的许多共同属性和操作没有好好地利用,需要重复的编写代码,降低了程序的开发效率,且使出现错误的机会增加。

仔细分析上面3个例子的类,可以看到这三个类都要计算面积与周长,虽然公式有所不同,但是目标是相同的。因此,可以把这三个类抽象出一个父类,在父类里面定义圆,三角形和矩形3个类共同的成员属性及成员方法。把计算面积和周长的成员方法名放在父类中说明,再在子类中将具体方法实现。

抽象类是它所有子类的公共属性集合,是包含一个或多个抽象方法的类。使用抽象类的一大优点是可以充分利用这些公有属性来提高开发和维护程序的效率。

2. 抽象方法

在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

abstract 返回值类型 方法名 (【参数列表】);

例如:abstract void eat();

注意:抽象方法没有定义的方法体,方法名后面直接跟一个分号,而不是花括号。抽象方法必须用abstract关键字进行修饰。

3.定义抽象类

如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。

例如:

//抽象类Animal
public abstract class Animal{
	//抽象方法shout
	public abstract void shout();
}

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public.

2)抽象类不能用来创建对象,需要子类采用向上转型的方式处理;

3)如果一个类继承于一个抽象类,则子类必须重写父类的全部抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

4)抽象类不能用final关键字声明,因为抽象类必须有子类,而final定义的类不能有子类。

抽象类实例:

 //抽象类Animal
  
   abstract class Animal{
    //抽象方法shout
    
    public abstract void shout();
    
    }
    //子类Dogs继承抽象父类Animal
    
   class Dogs extends Animal{
   
     //子类重写抽象类的抽象方法
     
     public void shout(){
     System.out.println(" 狗会汪汪汪地叫")}
    }
public class Test{
public static void main(String[] args){

	//抽象类通过子类向上转型实例化
	
	Animal animal = new Dogs();
	animal.shout();
}
}

注意:

抽象类是不能直接实例化的,一次Animal animal = new Animal()在编译的时候会报错,需要采用向上转型的方式来实例化。其实抽象类比普通类只是多了一些抽象方法,其他组成部分和普通类完全一样。

二. 接口

1. 接口声明

接口是比抽象类更高的抽象,它是一个完全抽象的类,即抽象方法的集合。接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。而抽象类既可以有抽象方法也可以有普通方法。

接口使用关键字interface来声明,语法格式如下:[ ] 里面的内容代表可有可无

[public] interface 接口名称 [extends 其他的类名] {
[public] [static] [final] 数据类型 成员名称 = 常量值;
[public] [static] [abstract] 返回值 抽象方法名 (参数列表)
}

接口中的方法是不能实现的,只能由实现接口的类来实现。一个类可以通过关键字implements来实现。如果实现类中没有实现接口中的所有抽象方法,那么该类必须声明为抽象类。下面是接口声明的一个简单例子。

声明一个含有面积和体积抽象方法的接口,并写一个长方形类实现接口,在测试类中测试一下长方形面积和周长:

interface Shape{
	public void area();  //计算面积
	public void perimeter();  //计算周长
} 
class Rectangle implements Shape{
	private double length;
	private double width;
	public Rectangle( ){ }    //空的构造方法
	public Rectangle(double length2,double width2 ){   //可传入长和宽参数的构造方法
		this.length = length2;
		this.width = width2;	
	}
    public void setLength(double length1){
		this.length = length1;
	}
	public double getLength(){
		return length;
	} 
	public void setWidth(double width1){
		this.width= width1;
	}
	public double getWidth(){
		return width;
	} 
	public void  area(){
		System.out.println("该长方形的面积是:" + length*width );
	}
	public void perimeter(){
		double a = 2*(length+width);
		System.out.println("该长方形的周长是:" + a );
	}
}
public class Count{
	public static void main(String[] args){
		Rectangle rt = new Rectangle();   //用无参构造函数实例化对象
		rt.setLength(2.0);
		rt.setWidth(4.0);
		rt.area();
		rt.perimeter();
		Rectangle rt2 = new Rectangle(3.0,5.0);  //用有参构造函数实例化一个新的对象,此对象通过含参构造函数赋值,可以  
																		 //	不用set赋值      		
		rt2.area();
		rt2.perimeter();
	}
}

三. 作业

人 :用筷子吃饭 ,工作是敲代码 ,在床上睡觉
猫:直接啃食物 ,工作是逮老鼠,在地面睡觉

写一个具有eat(),work(),sleep()抽象方法的抽象类,并分别写People,Cat类继承该抽象类并实现抽象方法,用Test类输出人和猫的具体特性。


转载自:https://blog.csdn.net/weixin_43547832/article/details/101302526

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值