抽象类
当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法 的实现方式是无法确定的。例如在定义Animal类时,shout方法用于表示动物的 叫声,但是针对不同的动物,叫声也是不同的,因此在shout方法中无法准确描述动物 的叫声。针对上面描述的情况,Java允许在定义方法时不写方法体,不包含方法体的方法为 抽象方法,抽象方法必须使用abstract关键字来修饰。而抽象方法只能存在于抽象类中。
具体示例如下:
abstract class Animal{ } //定义抽象类Animal
abstract void shout (); //定义抽象方法shout()
当一个类中包含了抽象方法,该类必须使用abstract关键字来修饰,使用abstrac关键字修饰的类为抽象类,具体示例如下:
//定义抽象类
abstract class Animal{
//定义抽象方法
abstract void shut();
}
//继承于Animal的猫类
class Cat extends Animal{
//重写父类的shut()方法
void shut(){
System.out.println("喵喵......");
}
}
//继承于Animal的狗类
class Dog extends Animal {
//重写shut()方法
void shut(){
System.out.println("汪汪......");
}
}
class RunAnimal{
public static void main(String[] args){
Cat c = new Cat();
Dog d = new Dog();
c.shut();
d.shut();
}
}
/*
运行结果:
喵喵......
汪汪......
*/
当多个类中出现相同功能,但是功能的主体不同,这时可以进行向上抽取,只抽取功能定义,而不抽取功能主体。
抽象类的特点:
1.抽象方法一定在抽象类中。
2.抽象方法和抽象类都必须用abstract关键字修饰。
3.抽象类不能实例化对象,因为调用抽象类方法没有意义。
4.抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了抽象类部分的抽象方法,那么该子类还是一个抽象类。
接口
接口:可以理解成一个特殊的抽象类。
当抽象类中的方法全是抽象的时候,那么该抽象类可以通过接口的形式来表示。
class 用于定义类
interface 用于定义接口。 格式:interface Animal{} //定义了、animal接口。
接口定义时,其格式特点:
1.接口中常见定义:常量,抽象方法。
2.接口中的成员都有默认的固定修饰符:
常量:public static final //也就是说你在接口中定义一个常量,编译时java虚拟机会自动在常量前面加上这固定的修饰符。
方法:public abstract //方法都是固定的 会被修饰成公有和抽象
接口的特点:
- 接口是对外暴露的规则
- 接口是程序的功能扩展
- 接口可以用来多实现
- 类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口
- 接口与接口之间也可以有继承关系
同时实现多个接口:
interface Demo1{
void shut1();
}
interface Demo2{
void shut2();
}
class Demo implements Demo1,Demo2{
public void shut1(){
System.out.println("继承于接口1");
}
public void shut2(){
System.out.println("继承于接口2");
}
}
class Runing {
public static void main(String[] args){
Demo d = new Demo();
d.shut1();
d.shut2();
}
}
/*
运行结果:
继承于接口1
继承于接口2
*/
下面有这样一道题:一个公司有员工和个部门经理 ,编写一个程序可以描述出每雇员的基本信息和一些特殊特征。
思考:经理和员工都属于公司的雇员,但是经理有年终奖而员工没有,而且经理和员工都有抽烟的。
我们可以定义两个接口,分别描述年终奖和抽烟。在定义一个雇员类,员工和经理继承于雇员类,并可以选择性的实现抽烟或者年终奖接口。
//定义抽烟接口
interface Smoke{
void smokeing();
}
//定义年终奖接口
interface Bonus{
void bonusing();
}
//定义雇员类
class Employee{
String name ;
String id ;
String branch ;
int age ;
void work(){
System.out.println("雇员和员工都需要工作");
}
}
//抽烟的经理 继承于雇员,实现抽烟接口和年终奖接口
class JingLi extends Employee implements Smoke,Bonus{
//复写smoking()抽象方法
void smokeing(){
System.out.println("我抽烟");
}
//复写bonusing方法
void bonusing(){
System.out.println("有年终奖");
}
}
//抽烟的员工 继承于雇员,实现抽烟接口
class Smokehand extends Employee implements Smoke{
//复写smoking()抽象方法
void smokeing(){
System.out.println("我抽烟");
}
}
//不抽烟的经理 继承于雇员,实现年终奖接口
class JingLi extends Employee implements Bonus{
//复写bonusing方法
void bonusing(){
System.out.println("有年终奖");
}
}