Java学习笔记之---比较接口与抽象类

抽象类是描述事物的本质,接口是描述事物的功能

接口与抽象类的异同

1.一个类只能继承一个父类,但是可以有多个接口

2.抽象类中的抽象方法没有方法体,但是可以有非抽象方法;接口中的方法没有方法体,但是可以通过default或者static拥有方法体

3.如果子类不能重写父类中的抽象方法和接口中的方法,可以把子类变为abstract修饰的

4.子类重写父类的方法时形参不能改变,返回值类型不能改变

5.抽象类中可以包含构造函数,但是接口中不能出现构造函数

6.接口中只能定义静态常量,而抽象类中即可以定义静态常量属性,也可以定义普通属性

7.由default或者static修饰的接口内的方法可以不被子类重写,也可以有方法体

举一个例子:保温杯是水杯,所以水杯应该设计成抽象类,保温杯的功能是保温,所以保温应该设计为接口

实例:杯子类为抽象类,保温和喝为接口,保温杯为子类

public abstract class Cup {
private static String name;
private String color;
//抽象类中可以包含构造函数,但是接口中不能出现构造函数
public Cup(){ }
public Cup(String name,String color){
this.setName(name);
this.setColor(color);
}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
public abstract void decorate();
//抽象类中的抽象方法没有方法体,但是可以有非抽象方法
public void lid(){
System.out.println("杯子有盖子");
}
}
public interface Drink {

    //由default或者static修饰的接口内的方法可以不被子类重写,也可以有方法体

    public default void eat(){

        System.out.println("杯子可以喝水");

    }

}
 
public interface Vacuum {

    //接口中只能定义静态常量

    static int i=1;

    public void warm();

}
 
//一个类只能继承一个父类,但是可以有多个接口

public  class VacuumCup extends Cup implements Drink,Vacuum{

    public VacuumCup(){

    }

    public VacuumCup(String name,String color){

        super(name,color);

    }

    @Override

    //子类重写父类的方法时形参不能改变,返回值类型不能改变

    public void decorate(){

        System.out.println("装饰桌子");

    }

    @Override

    public void warm(){

        System.out.println("杯子可以保温");

    }

}

class CupTest{

    public static void main(String[] args){

        Cup a=new VacuumCup("aa","red");

        System.out.println(a.getName()+":"+a.getColor());

        a.decorate();

        ((VacuumCup) a).warm();

        a.lid();

    }

}

运行结果:

aa:red

装饰桌子

杯子可以保温

杯子有盖子

Java学习笔记之---比较接口与抽象类的更多相关文章

  1. Java学习笔记:03面向对象-接口_多态

    1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...

  2. 【Java学习笔记之二十一】抽象类在Java继承中的用法小结

    一.抽象类的基本概念 普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法.普通方法.static方法.常量和变量等内容.而抽象类是指在普通类的结构里面增加抽象方法的组成 ...

  3. Java学习笔记——继承、接口、多态

    浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...

  4. 【Head First Java 读书笔记】(八)接口与抽象类

    接口是什么?它是一种百分之百纯抽象的类. 什么是抽象类?即无法初始化的类.   例如,我们设计一个animal类,以此类为父类,分别设计了多种动物子类,例如Lion,Tiger,Cat,Wolf,Do ...

  5. Java学习笔记(十)面向对象---接口

    理解 初期理解 可以认为接口是一个特殊的抽象类.当接口中的方法都是抽象的,那么该类可以通过接口的形式来表示. class用于定义类 interface用于定义接口 格式特点 接口中常见定义:常量,抽象 ...

  6. 【Java学习笔记】Map接口的子接口---TreeMap

    TreeMap,与TreeSet类似,可以对集合中的元素进行排序,同时保持元素的唯一性. 应注意,Comparable(实现接口,记得覆盖comparaTo方法),Comparator的使用. imp ...

  7. java学习笔记——Collection集合接口

    NO 方法名称 描述 1 public boolean add(E e) 向集合中保存数据 2 public void clear() 清空集合 3 public boolean contains(O ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 接口(抽象类)

    接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类中至少有一个函数被声明为纯虚 ...

  9. java学习笔记(1)——有关接口

    接口: interface intf0{ public void doSomething(); } interface intf1{ public void doAnything(); } class ...

随机推荐

  1. PHP 实现自动加载器(Autoloader)

    我们知道PHP可以实现自动加载,避免了繁重的体力活,代码更规范,整洁.那如果我们把这个自动加载再升华一下,变成自动加载类,每次只需要引入这个类,那么其他类就自动加载了,已经开源,仓库地址在这里.同时如 ...

  2. Win8Metro(C#)数字图像处理--2.13Roberts边缘检测

    原文:Win8Metro(C#)数字图像处理--2.13Roberts边缘检测  [函数名称] 图像Roberts边缘检测函数RobertEdgeProcess(WriteableBitmap s ...

  3. 深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数

    原文:深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数 概述 COLUMNS_UPDATED函数能够出现在INSERT或UPDATE触发器中AS关键字后的任何位置,用来 ...

  4. 内存可用性判断 IsBadCodePtr IsBadReadPtr 等等

    程序异常崩溃,多数是有内存访问异常引起.为定位崩溃位置通常考虑加强内存访问控制,如此有必要进行内存可用性判断,从<Windows核心编程>中看到内存指针的可用性判断方法,感觉还不错,此处记 ...

  5. 利用shell脚本实现计划任务功能 V1.2

    2013.05.10  mytask 1.2 主程序休眠时间分成若干小的时间片断分段休眠,避免长时间的休眠不能及时响应系统信号. 2013.05.07 mytask 1.1 昨天发布了mytask1. ...

  6. HUSTOJ的Windows版评判内核(限制内存使用)

    HUSTOJ的Windows版评判内核(一) 作者:游蓝海 个人主页:http://blog.csdn.net/you_lan_hai 2013.4.9 注:最新版本项目地址:https://gith ...

  7. MongoDB对文档的操作

    插入文档 db.COLLECTION_NAME.insert({doc1},{doc2},...) e.g.:db.collection.insert({name:'123',age:12},{nam ...

  8. Java虚拟机性能监控与调优实战

    From:  https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...

  9. CDC-更改数据捕获存储过程 (Transact-SQL)-学习

    背景: 在SQLServer2008之前,对数据变更的捕获通常使用触发器.时间戳等低效高成本的功能来实现,所以很多系统都没有做数据变更或者仅仅对核心表做监控. 适用环境: 仅在SQLServer200 ...

  10. C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)

    在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换( ...