面向对象之抽象类与接口

抽象类

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

abstract void fun();

  抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

abstract class test{
    public abstract void  fun();
}

从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

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

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

  2)抽象类不能用来创建对象;

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

      4 ) 抽象类不能与一些关键字共存

        private:abstract是表明希望被覆盖的,但是private,子类看不到。

        static:如果是static就需要创建对象,但abstract不需要创建对象(没有意义)

        final:final表示不能被子类覆盖,abstract表名希望被覆盖

  在其他方面,抽象类和普通的类并没有区别。

抽象类的简单练习

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Coder c = new Coder("lele","007",8000);
		c.work();
		Manage m = new Manage("zz","008",9000,200);
		m.work();
 	}
}
abstract class Employee{
	public String  name;
	public String id;
	public int Salary;
	public Employee() {}		//空参构造
	public Employee(String name, String id, int salary) {
		//super();
		this.name = name;
		this.id = id;
		this.Salary = salary;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public int getSalary() {
		return Salary;
	}
	public void setSalary(int salary) {
		Salary = salary;
	}
	public abstract void work();
}
class Manage extends Employee{
	private Integer prize;
	public Manage() {}		//空参构造
	public Manage(String name, String id, int salary,Integer prize) {
		super(name,id,salary);
		this.prize = prize;
	}
	public void work() {
		System.out.println("我是经理"+this.getName()+",我的工号是"+this.getId()+"我的工资"+this.getSalary()+"我的奖金"+this.prize);
	}
}
class Coder extends Employee{
	public Coder() {}		//空参构造
	public Coder(String name, String id, int salary) {
		//super();
		this.name = name;
		this.id = id;
		this.Salary = salary;
	}
	public void work() {
		System.out.println("我是程序员"+this.getName()+",我的工号是"+this.getId()+"我的工资"+this.getSalary());
	}
}

接口

接口描述了实现了它的类拥有什么功能。因为Java是强类型的,所以有些操作必须用接口去约束和标记。接口作为类的能力的证明,它表明了实现了接口的类能做什么。

类似与class,interface也是java中的一种引用类型。

接口中的成员

接口中的所有的成员,缺省情况下都是public的,也必须是public,无论是方法,还是字段。因为接口就是规定了API,如果实现的类不公开接口中的API,怎么能叫API呢?

一般情况下,接口中可以 定义方法 和 字段。

接口中的字段,必须(默认)为 public static final  。在定义的接口中必须初始化,因为是final。它们将成为类中的静态常量字段

接口中的方法,必须(默认)为 public abstract    。只需在接口中定义即可,不能实现(让实现了接口的类去实现)。将成为类中的public 实例方法  , 实现了接口的类必须实现接口中定义的方法。

1)一个类不写继承任何类默认继承Object类

2)接口中不能定义非抽象方法

public void print(){

}                //不能定义非抽象方法

void print();//默认加了abstract,public   因此在重写中权限应该是public

3)接口中没有构造方法

interface myInter{
	public static final int num = 10;
}
class Imptest /*extends Object*/ implements myInter{
	public void print() {
		System.out.println(num);
	}
}

a,类与类:只能单继承,可以多层继承

b,类与接口:可以单实现,也可以多实现,并且在继承一个类的同时实现多个接口

c,接口与接口:可以单继承,可以多继承

抽象类与接口的区别

A:成员区别

  •  抽象类
  1. 成员变量:可以变量,可以常量
  2. 构造方法:有
  3. 成员方法:可以抽象,可以非抽象
  • 接口        
  1. 成员变量:只可以常量
  2. 成员方法:只可以抽象

B:关系区别

  • 类与类:继承,单继承
  • 类与接口:实现,单实现,多实现
  • 接口与接口:继承,单继承,多继承

C:设计理念区别

  • 抽象类:被继承体现的是:“is a”的关系。抽象类中定义的是该继承体系的共性功能
  • 接口: 被实现体体现的是:“like a”的关系。接口中定义的是继承体系的扩展功能

猜你喜欢

转载自blog.csdn.net/qq_39478237/article/details/81142020