Java抽象类和接口

一、抽象类

1.抽象类的基本概念

普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。

那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。

而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。

//有抽象方法的类也必须被声明为abstract
public abstract class Test1 {
	//抽象方法,不能有“{}”
	public abstract void f();
}

抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。

抽象类不能被实例化,也就是不能使用new关键字来得到一个抽象类的实例,抽象方法必须在子类中被实现。

//有抽象方法的类也必须被声明为abstract
public class Test1 {
	public static void main(String[] args) {
		Teacher teacher=new Teacher("老师");
		teacher.work();		
		Driver driver=new Driver("老司机");
		driver.work();
	}
}
//一个抽象类
abstract class People{
	//抽象方法
	public abstract void work();
}
class Teacher extends People{
	private String work;
	public Teacher(String work) {
		this.work=work;
	}
	@Override
	public void work() {
		System.out.println("我是"+this.work);
	}
}
class Driver extends People{
	private String work;
	public Driver(String work) {
		this.work=work;
	}
	@Override
	public void work() {
		System.out.println("他是"+this.work);
	}	
}

运行结果如下:

我是老师
他是老司机

2.抽象类和一般类的区别:

相同点:抽象类和一般类都是用来描述事物的,都在内部定了成员。

不同点:
(1)一般类有足够的信息描述事物。抽象类描述事物的信息有可能不足

(2)一般类中不能定义抽象类方法,只能定非抽象方法。抽象类中可定义抽象方法,同时也可定义非抽象类

(3)一般类可以被实例化,抽象类不可以被实例化

3.抽象类可以不定义抽象方法吗?

可以的。但是很少见,目的就是不让该类创建对象。AWT的适配器对象就是这种类。通常这个类中的方法体,但是却没有内容。

二、接口

1.接口的基本概念

接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。

如定义一个接口:

interface A{//定义一个接口
    public static final String MSG = "hello";//全局常量
    public abstract void print();//抽象方法
}

2.接口的使用

由于接口里面存在抽象方法,所以接口对象不能直接使用关键字new进行实例化。接口的使用原则如下:
(1)接口必须要有子类,但此时一个子类可以使用implements关键字实现多个接口

(2)接口的子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法

(3)接口的对象可以利用子类对象的向上转型进行实例化。

如:

package com.wz.interfacedemo;
interface A{//定义一个接口A
    public static final String MSG = "hello";//全局常量
    public abstract void print();//抽象方法
}
interface B{//定义一个接口B
    public abstract void get();
}

class X implements A,B{//X类实现了A和B两个接口
    @Override
    public void print() {
        System.out.println("接口A的抽象方法print()");
    }
    @Override
    public void get() {
        System.out.println("接口B的抽象方法get()");
    }
}

public class TestDemo {
    public static void main(String[] args){
        X x = new X();//实例化子类对象
        A a = x;//向上转型
        B b = x;//向上转型
        a.print();
        b.get();
    }
}

运行结果如下:

接口A的抽象方法print()
接口B的抽象方法get()

三、抽象类和接口的区别

1.相同点

(1)都不能被实例化

(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

2.不同点

(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。

(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。

(3)接口强调特定功能的实现,而抽象类强调所属关系。

(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。

(5)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值