12. JavaSE-抽象类 & 接口

抽象类:

1. 抽象的概念:笼统、模糊、不具体

2. 特点:方法只有声明没有实现时,该方法就是抽象方法,需要被abstract关键字修饰,抽象方法

必须定义在抽象类中,该类也必须被abstract修饰

3. 抽象类不可以被实例化。因为调用抽象方法没意义,无方法体

4. 抽象类必须有其子类覆盖了所有的抽象方法后,该子类才能被实例化,否则、子类还是抽象类。

抽象类有构造函数吗?

有、用于给子类对象进行初始化

抽象类可以不定义抽象方法吗?

可以、但是很少见,目的就是不让该类创建对象,AWT的适配器对象就是这样的;通常这个抽象类中的方法有方法体,但是却没有内容。

抽象关键字不可以和哪些关键字共存?

1. Private  因为抽象类中的方法必须被覆盖,如果私有化,就不能被覆盖,因此不能和private共存

2. Static 一旦静态化,意味着直接使用类名就可以调用,不需要对象,但是抽象方法没有具体

实现,没有意义。

3. Final 一旦final化,意味着不能被覆盖或继承,与抽象类必须被覆盖冲突

抽象类和一般类的异同点?

相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员

不同点:

1. 一般类有足够的信息描述事务;抽象类描述事务的信息有可能不足

2. 一般类中不能定义抽象方法,只能定义非抽象方法;抽象类中可定义抽象方法,同时也可

以定义非抽象方法

3. 一般类可以被实例化;抽象类不能被实例化

抽象类一定是个父类吗?

是的,因为需要子类覆盖其方法后才可以对子类实例化

雇员示例 :

/*

雇员示例:

要求:公司中程序员有姓名,工号,薪水,工作内容

项目经理除了有姓名,工号,薪水,还有奖金,工作内容

对给出的需求进行数据建模

分析:

在这个问题领域中,先找出涉及的对象

通过名词提炼法

程序员:

属性:姓名、工号、薪水

行为:工作

经理:

属性:姓名,工号,薪水,奖金

行为:工作

程序员和经理不存在直接的继承关系

但是程序员和经理却具有共性内容

可以进行抽取,因为他们都是公司的雇员

可以将程序员和经理进行抽取,建立体系

*/

//描述雇员

abstract class Employee

{

private String name;

private String id;

private double pay;

Employee(String name, String id, double pay)

{

this.name = name;

this.id = id;

this.pay = pay;

}

public abstract void work();

}

class Programer extends Employee

{

Programer(String name, String id, double pay)

{

super(name,id,pay);

}

public void work()

{

System.out.println("code ...");

}

}

class Manager extends Employee

{

private int bonus;

Manager(String name, String id, double pay,int bonus)

{

super(name,id,pay);

this.bonus = bonus;

}

public void work()

{

System.out.println("manager ...");

}

}

class AbstractTest

{

public static void main(String[] args)

{

Programer p1 = new Programer("keyman","1",1000);

p1.work();

Manager m1 = new Manager("keyman","2",10000,2000);

m1.work();

//System.out.println("Hello World!");

}

}

接口:

1. 格式:interface {}

2. 接口中的成员修饰符是固定的

成员常量:public static final

成员函数:public abstract

接口中的成员都是public的

3. 接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。

当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是 接口 interface。

定义接口使用的关键字不是class,是interface:

interface Demo

{

public static final int NUMBER = 10;

public abstract void show1();

public abstract void show2();

}

类与类之间是继承关系;类与接口之间是实现关系

接口不可以实例化。只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化,否则,这个子类就是一个抽象类

interface Demo

{

public static final int NUMBER = 10;

public abstract void show1();

public abstract void show2();

}

class  InterfaceDemo

{

public static void main(String[] args)

{

//System.out.println("Hello World!");

DemoImpl d = new DemoImpl();

System.out.println(d.NUMBER);

System.out.println(Demo.NUMBER);

System.out.println(DemoImpl.NUMBER);

}

}

class DemoImpl implements Demo

{

public void show1(){

System.out.println("show1 run");

}

public void show2(){

System.out.println("show2 run");

}

}

在java中不直接支持多继承,因为会出现调用的不确定性,所以java将多继承机制进行改良,在java中变成 接口多实现

一个类可以实现多个接口。

interface DemoA

{

public static final int NUMBER = 20;

public abstract void show1();

public abstract void show();

}

interface DemoB

{

public static final int NUMBER = 10;

public abstract void show2();

public abstract void show();

}

class  InterfaceDemo

{

public static void main(String[] args)

{

/*此处代码运行失败,因为对于d.NUMBER以及DemoImpl.NUMBER两种方式的调用将出现调用的不确定性*/

DemoImpl d = new DemoImpl();

System.out.println(d.NUMBER);

System.out.println(DemoA.NUMBER);

System.out.println(DemoImpl.NUMBER);

}

}

class DemoImpl implements DemoA,DemoB

{

public void show1(){

System.out.println("show1 run");

}

public void show2(){

System.out.println("show2 run");

}

public void show(){

System.out.println("show run");

}

}

一个类在继承另一个类的同时,还可以实现多个接口。

接口的出现避免了单继承的局限性

接口与接口之间是继承关系,而且接口可以多继承

interface A

{

public abstract void show();

}

interface B

{

public abstract int add(int x,int y);

}

interface C extends A,B

{

public abstract int mul(int x, int y);

}

class D

{

public int static NUMBER=0;

}

class Demo extends D implements C

{

public void show(){}

public int add(int x, int y){}

public int mul(int x, int y){}

}

class DemoRun

{

public static void main(String[] args)

{

new Demo().show();

}

}

接口特点:

1. 是对外暴漏的规则

2. 是程序的功能扩展

3. 接口的出现降低耦合性

4. 接口可以用来多实现

5. 类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口

6. 接口与接口之间是继承关系

接口与抽象类的异同:

相同点:都是不断的向上抽取而来,并且都是描述不具体。

不同点:

1. 抽象类需要被继承,而且只能单继承;接口需要被实现,而且可以多实现

2. 抽象类中可以定义抽象方法和非抽象方法,子类继承后可以直接使用非抽象方法;接口中只能定义抽象方法,必须由子类实现

3. 抽象类的继承是 is a 关系,在定义该体系的基本共性内容;接口的实现是 like a 关系,是在定义体系额外功能

例如:犬按功能分有导盲犬、搜爆犬。

Abstract Class 犬

{

Abstract Void 吼叫();

}

Class 导盲犬

{

Public void 吼叫(){}

Public void 导盲(){}

}

Class 搜爆犬

{

Public void 吼叫(){}

Public void 搜爆(){}

}

等同于

Abstract class 犬

{

Abstract void 吼叫();

}

Interface 导盲

{

Abstract void 导盲();

}

Class 导盲犬 extends 犬 implements 导盲

{

Public void 吼叫(){}

Public void 导盲(){}

}

下例展示了接口类型的引用

interface USB

{

abstract public void open();

abstract public void close();

}

class  BookPC

{

public static void main(String[] args)

{

useUSB(new UPan);

//System.out.println("Hello World!");

}

public static void useUSB(USB u) //接口类型的引用,用于接收(指向)接口的子类对象

{

u.open();

u.close();

}

}

class UPan implements USB

{

public void open()

{

System.out.println("upan open");

}

public void close()

{

System.out.println("upan close");

}

}

12. JavaSE-抽象类 & 接口

时间: 2024-10-02 19:48:25

12. JavaSE-抽象类 & 接口的相关文章

面向对象的理解 抽象类&接口

一.关于面向对象 1.什么是面向对象 在解释面向对象之前,先说说面向过程.学过C的同学都知道,C就是面向过程的一种语言.那什么是面向过程呢?比方说组装主机,对于面向过程,需要从0开始.买cpu,显卡,主板,电源,风扇,把这些都通过主板链接到一起.我需要清楚的知道主机组装的每一个步骤. 介绍了面向过程,再说会正题,什么是面向对象?对于上面的装主机过程面向对象会把主机先抽象成一个机箱,机箱里有cpu,显卡,主板,电源.用主机的人,不关心里面是怎么工作的,也不需要知道内部逻辑,只知道插上电源就能用.面

小知识(五):抽象类&接口

抽象类abstract: 抽象类和抽象方法可以用abstract关键字进行标识.就是没有完全定义的类或方法.所以不能直接实例化操作. 就因为他没完全定义所以不能用sealed关键字进行密封. 抽象方法不含程序主体: public abstract class Student { //抽象方法,不含程序体 public abstract void GetStudentID(); //子类可访问字段 prodected int i; //定义i的属性 public int I { get { ret

普通类 抽象类 接口

首先得搞懂什么是抽象类:一.概念:    在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样.并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类.    比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆.三角形这样一些具体概念.它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念.正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的

虚函数/纯虚函数/抽象类/接口/虚基类

1.多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 在Java中,没有指针,就直接用父类实例化子类对象 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的,多态可以让父类的指针有“多种形态”,这是一种泛型技术. 所谓泛型技术,就是试图使用不变的代码来实现可变的算法 2.虚函数 在基类的类定义中,定义虚函数的一般形式: Virtual 函数返回值类型 虚函数名(形参表){ 函数

19 抽象类 接口类 封装. 多态

主要内容: 1.  抽象类(接口类): 制定一个规范  : from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): @abstractmethod def pay(self):pass class Alipay(Payment): def __init__(self,money): self.money = money def pay(self): print('使用支付宝支付了%s' % self.mon

“全栈2019”Java第一百零六章:匿名内部类与抽象类接口注意事项

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第一百零六章:匿名内部类与抽象类接口注意事项 下一章 "全栈2019"Java第一百零七章:匿名内部类与构造方法注意事项 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo

12:抽象类,接口,多重继承

抽象类的关键词是“abstract”,主要用于使基础类抽象化,即无法声明.抽象类中通常有抽象的方法(当然也可以有非抽象的方法),如果这个抽象类拥有子类,那么子类必须包含所有父类的抽象方法的具体实现,如果没有,那么编译器便会报错. 接口的关键词是“interface”,与之对应的继承为“implements”.接口内有方法,包括方法名,自变量列表,返回类型等,但不包括实现细节. 多重继承:一个类可以继承多个类以及多个接口,中间用逗号隔开,对类的继承要在对接口的继承的前面.另外,可以通过继承来拓展接

JavaSE知识-09(面向对象_多态&抽象类&接口)

多态的概述及其代码体现 多态(polymorphic)概述 事物存在的多种形态 多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. class Demo1_Polymorphic { public static void main(String[] args) { Cat c = new Cat(); c.eat(); Animal a = new Cat(); //猫是一只动物 //父类引用指向子类对象 a.eat(); } } class Animal { pu

抽象类-接口--抽象方法几点解释

//abstract class和interface有什么区别?含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的.abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,(抽象类中的普通方法,可以不必实现.)所以,不能有抽象构造方法或抽象静态方法.如果子类没有实现抽象父类中的所有抽 象方法,那么子类也必须定义

韩顺平循序渐进学java 第13讲 抽象类.接口

13.1抽象类 13.1.1 概念 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,称为抽象方法,用abstract来修饰该类,称为抽象类. 13.1.2 抽象类-深入讨论 抽象类是java中一个比较重要的类: 1.用abstract关键字来修饰一个类时,这个类就叫抽象类: 2.用abstract关键字来修饰一个方法时,这个方法就叫抽象方法: 3.抽象方法在编程中用的不是很多,但是在公司笔试时考的较多. 13.1.3 抽象类-注意事项 1.抽象类不能实例化: 2.抽象类不一