java中的抽象类与接口

1.抽象类的定义

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

2.简单实例

Shape类

package 抽象类;
/*
题目:
建立一个Shape抽象类,代表形状,求面积和周长两个方法
建立一个正方形类, 长方形 ,圆类 作为抽象类的子类,
通过抽象类来求面积和周长
*/

public abstract class Shape {
       public abstract double getArea();//抽象方法
       public abstract double getPan();
}

Square类

package 抽象类;

public class Square extends Shape{
     protected double len;
     Square(double len){
             this.len = len;
     }
     public double getArea(){
             return len*len;
     }
     public double getPan(){
             return 4*len;
     }
}

Circle类

public class Circle extends Shape{
     private double r;
     Circle (double r){
             this.r = r;
     }
     public double getArea(){
             return Math.PI*r*r;
     }
     public double getPan(){
             return Math.PI*r*2;
     }
}

Demo_Test2类

package 抽象类;

public class Demo_Test2 {

    public static void main(String[] args) {
        //求正方形的面积和周长
        Square square = new Square(3);
        double area = square.getArea();
        double zc = square.getPan();
        System.out.println("正方形的面积:"+area);
        System.out.println("正方形的周长:"+zc);
        

    }

}

3.总结:

  • 1. 抽象类不能被实例化

  • 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  • 3. 抽象类中的抽象方法只是声明,不包含方法体。

  • 4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

  • 5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

4.接口的概念

       接口是只有全局常量和公共抽象方法的一种特殊类,由于在java中只能使用单继承的方式,所以增加接口类型,可以让类实现多个接口。

弥补单继承机制的不足。在接口中所有的常量都默认修饰public static final,所有的方法默认修饰public abstract(JDK1.8之前)。

 补充:JDK1.8中对接口增加的特性:

(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;

(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。

5.接口与抽象类的异同

相同点:(1)接口与抽象类都不能直接实例化.

不同点:(1)接口中的方法全部是抽象方法,抽象类中的方法不全是。

    (2)一个类可以实现多个接口,但是一个子类只能继承一个父类。

               (3)接口中的成员权限都是public,抽象类中不一定。

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

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

     (6)接口是对行为的抽象,抽象类是对一类事物的抽象。

6.简单示例

AnimalAction接口,代表动物行为

package 接口实例;

public interface AnimalAction {
    
    //
    void eat();
    //public void eat();
    //
    void drink();
    
}
AnimalLove接口,代表动物的求偶方式
package 接口实例;

public interface AnimalLove {
    //求偶方式
    void LoveType();
}

AnimalSleep接口,代表动物的作息方式

package 接口实例;

public interface AnimalSleep {
    //作息方式
    String sleep();
}

Bird类

package 接口实例;

public class Bird implements AnimalAction,AnimalLove,AnimalSleep{

    @Override
    public String sleep() {
        String string="我是鸟,白天觅食,晚上睡觉";
        return string;
    }

    @Override
    public void LoveType() {
        System.out.println("我是鸟,求偶方式是修房子");    
    }

    @Override
    public void eat() {
        System.out.println("我是鸟,喜欢吃虫子");    
        
    }

    @Override
    public void drink() {
        System.out.println("我是鸟,喝水啄着喝");
    }

}
View Code

Cat类

package 接口实例;

public class Cat implements AnimalAction,AnimalSleep,AnimalLove{

    @Override
    public void LoveType() {
        System.out.println("我是猫,求偶方式是抓老鼠");    
    }

    @Override
    public String sleep() {
        String string="我是猫,白天睡觉,晚上活动";
        return string;            
    }

    @Override
    public void eat() {
        System.out.println("我是猫,喜欢吃鱼");    
    }

    @Override
    public void drink() {
        System.out.println("我是猫,喝水很斯文");
    }
    
    
    
}
View Code

Test类,用于测试

package 接口实例;

public class Test {

    //可以用接口创建的引用作为方法的形参
    public void BuruAnimal(AnimalAction action)
    {
        if (action instanceof Cat) {
            Cat cat1 = (Cat) action;
            cat1.eat();
        }
        
        if (action instanceof Bird) {
            Bird bird = (Bird)action;
            bird.eat();
        }
    }
    

    public static void main(String[] args) {
        //向上转型,自动的
        AnimalAction action = new Cat();
        
        action.eat();
        action.drink();
        
        //The method sleep() is undefined for the type AnimalAction
        //action.sleep();
        
        action = new Bird();
        action.eat();
        action.drink();
        
        //向下转型,强制转换的
        Bird xBird = (Bird)action;
        xBird.LoveType();
       System.out.println(xBird.sleep());
       
    }

}

运行结果:

参考文章:

https://blog.csdn.net/ahuan08/article/details/86606056

 https://zhuanlan.zhihu.com/p/94770324

转载文章链接已标明,如有侵权请告知。文章仅作为知识记忆所用,如有错误,敬请指正。
原文地址:https://www.cnblogs.com/YorkZhangYang/p/12741692.html