3、黑马程序员——抽象类、接口
来源:互联网 发布:8月编程语言排行榜 编辑:程序博客网 时间:2024/06/13 12:03
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
3.1 抽象类概述
抽象定义:抽象就是从多个事物中将共性的、本质的内容抽取出来。
例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。
抽象类:
Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的 类就是抽象类。
抽象方法的由来:
多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽 取功能主体,那么只有功能声明,没有功能主体的方法称为抽法。
例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽象出来的犬科虽然有吼叫功能,但是并不 明确吼叫的细节。
3.2 抽象类的特点
抽象类和抽象方法必须用abstract关键字来修饰。抽象方法只有方法声明,没有方法体,定义在抽象类中。
格式:修饰符abstract返回值类型函数名(参数列表);
抽象类不可以被实例化,也就是不可以用new创建对象。
原因如下:
1.抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。例如:犬科是一个抽象的概念,真正 存在的是狼和狗。
2.而且抽象类即使创建了对象,调用抽象方法也没有意义。
3.抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也 是抽象类。
示例:
package day3;abstract class Demo{abstract void show();}class DemoA extends Demo{void show(){System.out.println("demoa show");}}class DemoB extends Demo{void show(){System.out.println("demob show");}}public class AbstractDemo {public static void main(String[] args) {DemoA demoA = new DemoA();demoA.show();DemoB demoB = new DemoB();demoB.show();}}
抽象类中是否有构造函数?
答:有,用于给子类对象进行初始化。
抽象关键字abstract不可以和哪些关键字共存?
答:private、static、final。
抽象类中可不可以没有抽象方法?
答:可以,但是很少见。目的就是不让该类创建对象,AWT的适配器对象就是这种类。通常这个类中的方法有方法体,但是却没有内容。
抽象类和一般类的区别?
答:
相同点:
抽象类和一般类都是用来描述事物的,都在内部定义了成员。
不同点:
1.一般类有足够的信息描述事物。
抽象类描述事物的信息有可能不足。
2.一般类中不能定义抽象方法,只能定义非抽象方法。
抽象类中可定义抽象方法,同时也可以定义非抽象方法。
3.一般类可以被实例化。
抽象类不可以被实例化。
抽象类一定是个父类吗?
答:是的,因为需要子类覆盖其方法后才可以对子类实例化。
3.3 抽象类举例代码讲解
需求:公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了有姓名,工号,薪水,还有奖金,工作内容。
分析:
在这个问题领域中,通过名词提炼法:
程序员:
属性:姓名,工号,薪水。
行为:工作。
经理:
属性:姓名,工号,薪水,奖金。
行为:工作。
程序员和经理不存在着直接继承关系。
但是,程序员和经理却具有共性内容,可以进行抽取,因为他们都是公司的雇员。
可以将程序员和经理进行抽取,建立体系。
代码:
package day3;/* * 需求: * 公司中程序员有姓名,工号,薪水,工作内容。 * 项目经理除了有姓名,工号,薪水,还有奖金,工作内容。 * 分析: * 在这个问题领域中,通过名词提炼法: * 程序员: * 属性:姓名,工号,薪水。 * 行为:工作。 * 经理: * 属性:姓名,工号,薪水,奖金。 * 行为:工作。 */ //描述雇员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 Programmer extends Employee{Programmer(String name, String id, double pay){super(name,id,pay);}@Override//覆盖抽象类的抽象方法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;}@Override//覆盖抽象类的抽象方法public void work() {System.out.println("manager");}}
3.4 接口
当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口。格式:interface{}
接口中的成员修饰符是固定的:
成员常量:publicstaticfinal
成员函数:publicabstract
由此得出结论,接口中的成员都是公共的权限。
接口是对外暴露的规则。
接口是程序的功能扩展。
注:
1、虽然抽象类中的全局变量和抽象方法的修饰符都可以不用写,但是这样阅读性很差。所以,最好写上。
2、类与类之间是继承关系,类与接口直接是实现关系。
3、接口不可以实例化,能由实现了接口并覆盖了接口中所有的抽象方法的子类实例化。否则,这个子类就是 一个抽象类。
示例:
package day3;interface Demo1{public static final int NUM = 4;public abstract void show1();public abstract void show2();}class DemoImp1 implements Demo1{public void show1(){}public void show2(){}}public class InterfaceDemo {public static void main(String[] args) {DemoImp1 d = new DemoImp1();System.out.println(d.NUM);System.out.println(DemoImp1.NUM);System.out.println(Demo1.NUM);}}
接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。
在java中不直接支持多继承,因为会出现调用的不确定性。
所以,java将多继承机制进行改良,在java中变成了多实现,一个类可以实现多个接口。
接口的出现避免了单继承的局限性。
一个类在继承另一个类的同时,还可以实现多个接口。
示例:
package day3;//java将多继承机制进行改良,在java中变成了多实现,一个类可以实现多个接口。interface A{public void show();}interface B{public void show();}//多实现class Test implements A,B{@Overridepublic void show() {System.out.println("Test");}}public class InterfaceDemo2 {public static void main(String[] args) {Test t = new Test();t.show();}}class Q{public void method(){}}//一个类在继承另一个类的同时,还可以实现多个接口。class Test2 extends Q implements A,B{@Overridepublic void show() {}}interface CC{void show();}interface MM{void method();}//接口与接口之间是继承关系,而且接口可以多继承interface QQ extends CC,MM{void function();}class WW implements QQ{//覆盖3个方法@Overridepublic void show() {}@Overridepublic void method() {}@Overridepublic void function() {}}
抽象类和接口的异同点?
相同点:
都是不断向上抽取而来的。
不同点:
1.抽象类需要被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2.抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。
接口中只能定义抽象方法,必须由子类去实现。
3.抽象类的继承,是is a关系,定义该体系的基本共性内容。
接口的实现是like a关系。
接口应用综合案例
代码:
package day3;/* * 笔记本电脑功能扩展案例 * 为了扩展笔记本的功能,但日后出现什么功能设备不知道。 * 因此需要定义一个规则,只要日后出现的设备都符合这个规则就可以了。 * 规则在JAVA中就是接口 */interface USB{//暴露的规则public void open();public void close();}//实现规则//这些设备和电脑的耦合性降低了class UPan implements USB{public void open(){System.out.println("UPan open");}public void close(){System.out.println("UPan close");}}public class BookPC {public static void main(String[] args) {// 功能扩展了useUSB(new UPan());}//使用规则public static void useUSB(USB u){//接口类型的引用,用于接收接口的子类对象if(u != null){u.open();u.close();}}}
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0
- 黑马程序员——抽象类&接口
- 黑马程序员——抽象类&接口
- 黑马程序员—抽象类和接口
- 黑马程序员—抽象类和接口
- 3、黑马程序员——抽象类、接口
- 黑马程序员——继承,抽象,接口
- 黑马程序员——继承,抽象,接口
- 黑马程序员—继承,抽象,接口
- 黑马程序员——抽象类, 接口, Object类
- 黑马程序员——子父类、抽象类、接口、内部类
- 黑马程序员——抽象类和接口
- 黑马程序员——继承,抽象类,接口概述
- 黑马程序员——抽象类、接口和内部类
- 黑马程序员——抽象类与接口
- 黑马程序员——抽象类,接口与内部类
- 黑马程序员——抽象类和接口
- 黑马程序员——抽象类和接口
- 黑马程序员——抽象类与接口
- 不可小视的贝叶斯(三)
- 设置NSZombieEnabled捕捉错误
- android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code
- 【JavaScript面向对象编程】20160105(对象)
- el 表达式处理字符串
- 3、黑马程序员——抽象类、接口
- hdu2955 dp(背包)
- 【SQL 编程你也行】SQL Server 2012新功能之函数:choose函数
- GPIO子系统
- Android:动画:tween动画
- ElasticSearch权威指南
- js、jquery常用
- 健忘的人
- UIAlertController在ios8的使用