Java中的抽象类和接口

抽象类 

 

当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法 的实现方式是无法确定的。例如在定义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("有年终奖");
    }
}



 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值