abstract的用法:
//通过abstract 关键字修饰的类叫抽象类。
abstract class Animal
{
String name;
String color; abstract public void run ();//抽象方法是没有主体,没有方法的具体实现。 public void eat (){ System.out.println("动物在吃东西");
} } //一非抽象的类继承了抽象类,必须实现抽象类中的所有方法。
class Dog extends Animal
{ //需要重写父类中的run方法 public void run(){ System.out.println(name + "跑的很快");
}
}
class a
{
public static void main(String[] args)
{ Dog dog = new Dog();
dog.name = "阿旺";
dog.run(); }
}
运行结果:
interface的用法:
/*
接口 : Java开发中比较常用。
接口作用 : 用来添加拓展功能。
为什么不用类呢?因为在java中是单继承的,有时候类是不能够满足 需求的
接口定义模式:
用interface关键字来表示接口
结构:
interface 接口名{}; //如何实现接口中的方法。需要用实现来完成。
结构:
class 类 implements 接口名1,接口名2...{ } java中是支持多实现,一个类可以实现多个接口。 接口作用 :
1.用来拓展功能
2.让程序解耦
3.定义约束 接口的使用注意事项:
1.接口是一个特殊的类,是可以定义属性和方法。
2.属性默认是用final修饰的 : public static final 实际上是一个常量。
3.方法都是抽象的 : abstract public
4.接口不能创建对象。
5.接口没有构造方法。
6.接口是给类去实现的,非抽象类实现接口时,必须将接口中的方法都实现了。 */ //定义一个橡皮擦的接口
interface Eraser
{
int a = 10; // 在接口定义的变量必须初始化。接口中的变量默认是final修饰的
static int b=0; //这样也是可以的,只要有数值
// int c; //这个没有初始化,会报错
//定义擦字行为
//定义在接口中的方法是不需要实现的
//接口中的方法都是抽象方法。
public void clear(); //默认是用abstract修饰的 } interface Pancil
{
public void write();
} class EraserAndPencil implements Pancil , Eraser
{ //一个类如果实现了一个接借口,需要将所有的抽象方法都实现
//写字的方法
public void write() { System.out.println(a+"铅笔可以写字");
}
//擦字的方法
public void clear(){ System.out.println("铅笔还可以擦字");
} } class a
{
public static void main(String[] args)
{
EraserAndPencil ep = new EraserAndPencil();
ep.write();
ep.clear();
}
}
运行效果图上:
在多态中接口的形式
/*
所谓金矿: 父类指针指向子类对象
多态的另一种表现形式:
接口的引用类型指向实现类。 // 多态的另一种表现形式。 实现关系下多态:
接口 变量 = new 接口实现类对象。 */
//定义一个接口 可以做增删改查的功能
interface Dao
{ public void add();
public void del();
public void upDate();
public void search();
} class UserDao implements Dao
{ public void add(){
System.out.println("添加");
}
public void del(){
System.out.println("删除");
}
public void upDate(){
System.out.println("修改");
}
public void search(){ System.out.println("查找");
} } class a
{
public static void main(String[] args)
{
//实现下的多态的表现
// Dao 接口 , 接口是不能过创建对象的。
Dao d = new UserDao(); // 在Java中用的比较多。 比如:List就是接口
d.add();
//多态的形式。 Java实际的例子
//List list = new ArrayList(); }
}
效果图:
结论:
两者的区别:
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据
成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,
interface表示的是"like-a"关系。
4.接口一般用于在抽象类中没有可供继承的默认实现时(即没有实例变量和默认方法实现)代替该类。
5.abstract class是另一种契约形式,是设计对实现的要求;而接口是服务器对客户端的要求。
6.abstract class是一个基类,不能被实例化;接口是个声明,每个对应接口的类都要实现方法。
7. 一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法
即可,这是抽象类的一个优点
8. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是
接口的一个缺点;而抽象类中如果有个非抽象方法改了,就不存在这个问题,只是为子类添加了一个新的方法。
9. 看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B 。
这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现,而需要走一些弯路。目前系统架构
的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。这就需要通过实现多个接口的方式来实现,显然,抽
象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,
然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends A , C extends B 如果想要为c抽象出一个抽象
类D的话,就需要找到它的最顶层A来从头做起,因为无法做到C extends D
abstract与interface的区别的更多相关文章
-
转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
-
Java开发之abstract 和 interface的区别
Java开发abstract 和 interface的区别 java开发里面经常会用到虚函数和接口,这两者的区别是什么呢? abstract: 子类里面只能继承一个父类 interface: 子类可以 ...
-
Java中abstract和interface的区别
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
-
abstract和interface的区别
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
-
虚方法(virtual)\抽象方法(abstract)\接口(interface)的区别
转自:https://www.cnblogs.com/fantaohaoyou/p/9402657.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽 ...
-
Java abstract class 和 interface 的区别
Java abstract class 和 interface 的区别 1. abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制 2. 以Door的抽象概 ...
-
Abstract Class与 Interface 的区别
表格 Abs ...
-
【转载】java abstract class和interface的区别
转载:https://blog.csdn.net/b271737818/article/details/3950245 在Java语言中,abstract class和interface是支持抽象类定 ...
-
Java abstract interface与 interface的区别
我们常常遇到abstract class与 interface的区别,今天却遇到了abstract interface,感觉interface不用abstract再修饰了啊.结论:事实也确实如此,编译 ...
随机推荐
-
spring加载过程,源码带你理解从初始化到bean注入
spring在容器启动时,容器正式初始化入口refresh()如下图 ①包括初始化FactoryBean.解析XML注册所有BeanDefinition信息 ②包括注册scope管理类 ③初始化单 ...
-
javascript小技巧:同步服务器时间、同步倒计时
之前在网上看到有人提问,如何在页面上同步显示服务器的时间,其实实现方法有几种,可能一般人立马就想到可以使用Ajax每隔一秒去请求服务器,然后将服务器获取到时间显示在页面上,这样虽然能够实现,但存在一个 ...
-
when compile /home/wangxiao/NVIDIA-CUDA-7.5 SAMPLES, it warning: gcc version larger than 4.9 not supported, so: old verson of gcc and g++ are needed
1. when compile /home/wangxiao/NVIDIA-CUDA-7.5 SAMPLES, it warning: gcc version larger than 4.9 not ...
-
Android API 中文(77)——AdapterView.OnItemSelectedListener
前言 本章内容是android.widget.AdapterView.OnItemSelectedListener,版本为Android 2.3 r1,翻译来自"cnmahj",欢 ...
-
linux 安装jdk-7u45-linux-x64.tar.gz
1.官网下载jdk-7u45-linux-x64.tar.gz 载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...
-
C 小白的 thrift 环境搭建
公司有个通讯 是用的 thrift ,thrift 是个什么都东西,可以类比 webservice 吧,比 webservice 高效些,不管是啥,搞他! 先在 mac 上搞本地开发环境 网上一搜 貌 ...
-
.NET项目引用黄色小三角以及找不到依赖的解决方法
上图,问题描述: 经过查证,这个是引用的项目框架版本和本项目框架版本不一致的症状. 解决办法: 点击项目右键属性,调整版本使两个项目的版本一致 问题解决.good! ----------------- ...
-
linux(centos)测试带宽
1.安装speedtest-cli speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行.它基于Speedtest.net的基础架 ...
-
『TensorFlow』分类问题与两种交叉熵
关于categorical cross entropy 和 binary cross entropy的比较,差异一般体现在不同的分类(二分类.多分类等)任务目标,可以参考文章keras中两种交叉熵损失 ...
-
iOS Sprite Kit教程之申请和下载证书
iOS Sprite Kit教程之申请和下载证书 模拟器虽然可以实现真机上的一些功能,但是它是有局限的.例如,在模拟器上没有重力感应.相机机等.如果想要进行此方面的游戏的开发,进行程序测试时,模拟器显 ...