一、抽象类:abstract

抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

格式如下:

  包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

  1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

  2)抽象类不能用来创建对象,但是它可以有构造方法,用来帮助子类实例化。

  3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

抽象类的具体实例如下:

//定义一个抽象类,切记它不能用来创建对象
abstract class Employee
{
//声明受保护的属性
protected String name;
protected String id;
protected double pay; //抽象类的构造方法
public Employee(String name,String id,double pay)
{
this.name = name;
this.id = id;
this.pay = pay;
}
//抽象类的普通成员方法
public void print()
{
System.out.println("name = "+name+"id = "+id+"pay = "+pay);
} //抽象类的抽象方法,子类必须实现该方法,不然子类也是抽象类
public abstract void work();
} //抽象类的一个子类
class Pro extends Employee
{
public Pro(String name,String id,double pay)
{
//调用父类的构造函数进行初始化
super(name,id,pay);
}
//实现了父类中的抽象方法,所以子类不再是抽象类
public void work()
{
System.out.println("Pro work");
}
} //抽象类的另一个子类
class Manager extends Employee
{
private double bonus;
public Manager(String name,String id,double pay,double bonus)
{
//调用父类的构造方法进行初始化
super(name,id,pay);
this.bonus = bonus;
}
//实现了父类中的方法,所以子类不再是抽象类
public void work()
{
System.out.println("Manager work");
}
} //测试类
class YuanGongDemo
{
public static void main(String[] args)
{
Pro p1 = new Pro("Liding","jfisd",578.5);
p1.work();
Manager p2 = new Manager("LiNing","技术部",4578.5,786.75);
p2.work();
}
}

二、接口:Interface

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

接口的主要特点:

1、接口中的成员变量默认都是public、static、final类型的,必须被显示初始化。

2、接口中的方法默认都是public、abstract类型的。

3、接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。

4、接口没有构造方法,不能被实例化。

5、一个接口不能实现另一个接口,但它可以继承多个其他接口。

6、接口必须通过类来实现它的抽象方法。

7、与子类继承抽象父类相似,当类实现了某个接口时,它必须实现接口中所有的抽象方法,否则这个类必须被定义为抽象类。

8、一个类只能继承一个直接的父类,但能实现多个接口。

接口声明和实现方式如下:

具体举例如下:

多态的功能扩展
基于电脑的实例(电脑主板)
扩展(网卡、声卡、、、)

interface PCI             //扩展功能的接口(规则)
{
public abstract void open();
public abstract void close();
} class MainBoard
{
public void run()
{
System.out.println("Mi anBoard run");
}
public void usePCI(PCI p) //PCI p = new NetCard() //接口型的引用指向自己的子类对象
{
p.open();
p.close();
} } class NetCard implements PCI // 实现网卡的连接
{
public void open()
{
System.out.println("NetCard open");
}
public void close()
{
System.out.println("NetCard close");
}
} class SoundCard implements PCI // 实现声卡的连接
{
public void open()
{
System.out.println("soundcard open");
}
public void close()
{
System.out.println("soundcard close");
}
} class DuoTaiDemo1 //测试类
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}
总结:抽象类和接口的区别

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

   2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

   3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

   4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

5)抽象类中的方法子类必须全部实现,不然子类也是抽象类,而接口中的抽象方法子类必须全部实现,是可选择实现的。

6)抽象类是一种模板设计模式,而接口是一种行为规范。

Java:抽象类abstract和接口Interface的更多相关文章

  1. C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

    由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...

  2. 抽象类 abstract 和 接口 interface 类的区别

    在看一些框架的优秀改良时,都会设计一层base层,并且 base里面一般都是 abstract 类,然后 就找了为什么做的原因.发现: PHP5支持抽象类和抽象方法.抽象类不能直接被实例化,你必须先继 ...

  3. c#中抽象类(abstract)和接口(interface)的相同点与区别

    相同点: 1.都可以被继承 2.都不能被实例化 3.都可以包含方法声明 4.派生类必须实现未实现的方法 区别: 1.抽象基类可以定义字段.属性.方法实现.接口只能定义属性.索引器.事件.和方法声明,不 ...

  4. C#中抽象类(abstract)和接口(interface)的实现

    抽象类 抽象方法是没有代码实现的方法,使用abstract关键字修饰: 抽象类是包含0到多个抽象方法的类,其不能实例化.含有抽象方法的类必须是抽象类,抽象类中也可以包含非抽象方法: 重写抽象类的方法用 ...

  5. 【温故知新】c#抽象类abstract与接口interface

    1.什么是抽象类 先来看MSDN对抽象类描述: 抽象类是一些留有部分或全部成员未实现的类,以便可以由派生类来提供实现. 在面向对象的编程中,抽象类用作层次结构的基类,并表示不同对象类型组的通用功能.  ...

  6. Java抽象类(Abstract Class)与接口(Interface)区别

    抽象类与接口比较 抽象类跟接口类似,都不能实例化,可能包含不需实现方法或已实现的方法. 抽象类可以定义一些不是静态或常量的字段,定义 public, protected, private访问级别的具体 ...

  7. Java中abstract class 和 interface 的解释和他们的异同点(转)

    (一)概述    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存 在,才赋予了Java强大的 面向对象能力.abstract ...

  8. `Java`中`abstract class`与`interface`区别

    abstract class Java中允许使用abstract修饰符声明方法,此时只定义方法但是不实现方法(abstract修饰的方法没有主体,只有一个签名和一个分号). 以下是abstract方法 ...

  9. python抽象类+抽象方法实现接口(interface)

    #python没有类似于java和C#的接口类(interface),需要使用抽象类 和抽象方法来实现接口功能 #!/usr/bin/env python#_*_ coding:utf-8 _*_ f ...

随机推荐

  1. 团队开发(NABC)

    特点:这是一个手机软件,能通过通讯录录入生日信息 N(Need需求):现在在交际圈中需要记住越来越多朋友的生日信息 A(Approach做法):由一个简单的闹钟为基础,添加与生日相关的功能,最终实现 ...

  2. 简单的C语言小学四则运算设计

    题目:设计一个简单的四则运算编辑器 思路:我使用的是C语言编程,看到题目首先要随机出3个随机数,其中两个为100以内的随机数(a,b),一个为0~3的随机数(k). k值的变化使得+ - * /的变化 ...

  3. ASP .NET下的301重定向如何做

    using System; using System.Collections.Generic; using System.Text; using System.Web.UI; using System ...

  4. FushionCharts Free 的运用[2D/3D图表处理]

    由于先前在一些论坛中谈论到这个插件的运用,留了一些QQ联系方式,最近老是被一些程序员“骚扰”,说是请教一些关于FushionChart Free图表的处理技术,先前还是比较乐意接受的,但发现后来一些完 ...

  5. Python 文件读和写

  6. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  7. 【BZOJ】【1520】【POI2006】Szk-Schools

    网络流/费用流 比较裸的一道题 依旧是二分图模型,由源点S连向每个学校 i (1,0),「注意是连向第 i 所学校,不是连向学校的标号m[i]……唉这里WA了一次」 然后对于每所学校 i 连接 j+n ...

  8. [REFERENCE] Real-Time-Normal-Map-Dxt-Compression

    DXT5N & 3Dc(aka BC5) compression in common code & SIMD: http://mrelusive.com/publications/pa ...

  9. smarty模板技术

    一.什么是smarty?smarty是一个使用php写出来的模板php模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用php程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美 ...

  10. php随机数怎么获取?一个简单的函数就能生成

    小美女建了一个站,有些页面相似度比较高,想添加一些字段来实现差异化,比如用php随机数生成从10到100之间随机一个数字.其实会php的朋友几十个字符就能实现了,如下代码所示,简单吧?10代表最小值, ...