目录
一. 抽象类
1.1 什么是抽象类
由关键字 abstract 修饰的,且类中的抽象方法不能具体实现的类 ,称之为抽象类。
抽象类中可以有抽象方法,语法:修饰符 abstract 返回值类型 方法名(){ }
1.2 抽象类与普通类的区别
(1)成员:抽象类中可以有普通成员,也可以有抽象方法;普通类只能有普通成员。
(2)关键字:抽象类由关键词所abstract修饰,普通类没有关键字abstract修饰。
(3)继承:抽象类必须被继承,且子类要重写父类中的抽象方法;普通类不需要被继承。
1.3 抽象类的作用
在一些情形下,多个类要去做同一种任务,但是各自完成的事情又有所差异,这时就可以写一个抽象类作为父类,在父类中写一个抽象方法,将所有子类都要做的共同的任务建立起来,但不做具体实现;子类继承父类后重写父类的抽象方法,来完成方法的具体实现。这样可以起一个预防和规范作用,防止用户犯下一些不经意的错误。
例如,多个类要去完成画图形的任务,三角形类完成画三角形,圆形类完成画圆形,矩形类完成画矩形。写一个抽象类作为父类,在父类中写一个抽象方法将画图形任务建立起来
abstract class Shape{
public abstract void drawShape();
}
子类继承抽象类后,要重写父类的抽象方法,来具体实现方法
class Triangle extends Shape{
@Override
public void drawShape() {
System.out.println("画三角形!");
}
}
class Circle extends Shape{
@Override
public void drawShape() {
System.out.println("画圆形!");
}
}
class Rect extends Shape{
@Override
public void drawShape() {
System.out.println("画矩形!");
}
}
1.4 抽象类的特点
(1)抽象类不可以实例化对象。
(2)抽象类中,抽象方法不能被private,static,final 修饰,因为父类的抽象方法是要在子类中被重写的 。
abstract class Shape{
public abstract void drawShape();//若不加修饰符,默认是public,不能被private修饰
}
二. 接口
2.1 什么是接口
在生活中,电脑上的的USB,插板上的插孔等都是接口,这些接口都是通用的,只要外部设备的制作标准是规范的,都可以正常插入接口进行使用。因此接口起到了一个行为规范作用,是公共行为的标准。在Java中,接口是多个类的规范标准,是一种引用数据类型。
2.2 接口的语法和特性
(1)定义:接口的定义与类的定义相似,将class替换为interface即可。
interface IFinish{
}
(2)变量:接口中,变量都默认为 public static final修饰的变量。
(3)方法:接口中,只能写抽象方法,不能写普通方法,因此接口中的方法不能具体实现。
interface IFinish{
void draw();//方法默认为abstract public修饰,可以不写
int a = 3;//变量默认为public static final 修饰,变量要就地初始化
}
(4)接口中不能有静态代码块和构造方法。
2.3 接口的使用
(1)接口不能直接使用,要通过类来实现接口,用到implements关键字,类实现接口的时候要重写接口中的抽象方法。
interface IFinish{
void draw();//方法默认为abstract public修饰,可以不写
}
class Triangle extends Shape implements IFinish{
@Override
public void drawShape() {
System.out.println("画三角形!");
}
@Override
public void draw() {
System.out.println("接口功能!");
}
}
(2)一个类能可以实现多个接口,中间用逗号隔开。实现每一个接口,都要重写每个接口的抽象方法。
interface IFinish1{
void draw1();//方法默认为abstract public修饰,可以不写
}
interface IFinish2{
void draw2();//方法默认为abstract public修饰,可以不写
}
class Triangle extends Shape implements IFinish1,IFinish2{
@Override
public void drawShape() {
System.out.println("画三角形!");
}
@Override
public void draw1() {
System.out.println("接口1!");
}
@Override
public void draw2() {
System.out.println("接口2!");
}
}
2.4 接口的实例
分别定义一个Fish类和Bird类,鱼和鸟都会吃,但鱼会游泳,鸟会飞,写三个接口分别建立 吃,游泳,飞 这三个功能,鱼类可以实现吃和游泳的接口,鸟能可以实现吃和飞的接口,不同的对象可以实现不同的功能。
interface IFlying{
void fly();
}
interface IEating{
void eat();
}
class Fish implements ISwimming,IEating{
public String name;
public Fish(){
this.name = "小鱼";
}
@Override
public void swim() {
System.out.println(this.name+"在游泳!");
}
@Override
public void eat() {
System.out.println(this.name+"在吃鱼食!");
}
}
class Bird implements IEating,IFlying{
public String name;
public Bird(){
this.name = "小鸟";
}
@Override
public void fly() {
System.out.println(this.name+"在飞!");
}
@Override
public void eat() {
System.out.println(this.name+"在吃鸟食!");
}
}
public class Abstract {
public static void main(String[] args) {
Fish fish = new Fish();
fish.swim();
fish.eat();
System.out.println("===================");
Bird bird = new Bird();
bird.fly();
bird.eat();
}
}
三. 接口和抽象类的区别
(1)关键字:接口的关键字 interface,抽象类关键字 abstract。
(2)成员:抽象类中可以有普通成员,也可以有抽象方法;接口只能有抽象方法,没有普通方法,并且接口中的变量都是默认为pulic static final修饰的变量。
(3)继承和实现:一个类只能继承一个抽象类,但可以实现多个接口。