黑马程序员——抽象类,接口总结
来源:互联网 发布:预览 mac 编辑:程序博客网 时间:2024/05/18 02:43
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一抽象类
(1)多个具体的事物具备相同的方法声明,而方法体不同,我们就只抽取方法声明,然后定义到一个类中。
而一个没有方法体的方法是一个抽象方法,一个类中有抽象方法,该类必须定义为抽象类。
(2)抽象类的特点:
A:抽象类或者抽象方法用abstract修饰。
B:抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
C:抽象类不能被实例化。
D:子类继承抽象类,要么是抽象类,要么重写所有父类抽象方法。
(3)抽象类的几个小问题
A:不能被实例化,要构造方法干啥?
B:一个类中没有抽象方法,居然定义抽象类,有什么意义?
C:抽象关键字不能和哪些关键字共存
a:private
b:final
c:static
(4)抽象类的成员:
A:成员变量 有变量,也有常量
B:构造方法 有构造方法,用于子类访问父类数据的初始化
C:成员方法 有抽象方法,也有非抽象的方法
(5)抽象类的案例
A:老师案例
B:学生案例
C:员工案例
(6)抽象方法:
多个对象都具备相同的功能,但是功能具体内容有所不同,
那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。
抽象类与抽象方法均需要使用abstract关键字。
抽象类:
包含抽象方法的类就是抽象类
(7)代码实现
class Demo1_Abstract { public static void main(String[] args) { //抽象类通过子类对象,多态地方式完成实例化 Animal c = new Cat(); Animal d = new Dog(); method(c); method(d); } public static void method(Animal animal) { animal.eat(); }}abstract class Animal{ //父类的方法,一般就是为了规定,该种类型应该有某个方法 public abstract void eat();}class Cat extends Animal{ //子类必须重写抽象父类的抽象方法,才能创建对象 public void eat(){ System.out.println("喵,吃了"); }}class Dog extends Animal{ //子类必须重写抽象父类的抽象方法,才能创建对象 public void eat(){ System.out.println("汪汪,吃了"); }}
注意:
不包含抽象方法的类,也有可能是抽象类
抽象类中可以包含非抽象方法
抽象类当中可以有没有抽象方法
任意类中可以一个方法都没有
!抽象类本身无法实例化
抽象类通过子类对象,多态地方式完成实例化
子类需要将抽象父类的抽象方法均覆盖才可以实例化,否则依然是抽象类。 抽象类强制子类必须实现抽象方法
二多态后的成员特点:
成员变量:
编译时检测父类是否有该变量
运行时访问的是父类的该变量
成员方法:
编译时检测父类是否有该方法
运行时调用的是子类的重写的方法
成员变量:
编译看左边父类类型是否有该属性
运行时访问的左边父类类型的属性
成员方法:
编译看左边父类类型是否有该方法
运行时看右边子类是否重写了该方法,如果重写,调用重写后的方法,否则使用从父类继承过来的方法
所有情况均看引用类型,只有在调用方法时,检查子类是否重写。
代码实例
class Demo07_Object{ public static void main(String[] args) { Animal a = new Cat(); //System.out.println(a.name); a.method(); }}//定义动物类class Animal{ //String name = "动物"; public void method() { System.out.println("动物的方法"); }}//定义猫类class Cat extends Animal{ //String name = "Tom"; public void method() { System.out.println("Tom的方法"); }}
三向上向下转型
子类自动向上转型成父类
向上向下转型
向下转型: 如果使用多态的方式,父类引用指向子类对象,则该对象是可以转回子类的。
如果是用父类引用指向父类对象时,是无法转成子类的。
类型转换异常在运行时报错,属于运行时异常。编译时不报错。
class Demo08_Object{ public static void main(String[] args) { //父类引用指向子类对象,多态 Animal a = new Cat(); //创建一个单纯的Animal对象,用来作为参数 Animal canshuAnimal = new Animal(); //调用多态形式的a的method2方法: a.method2(canshuAnimal); //父类引用指向子类对象,多态 Animal a2 = new Cat(); //创建一个单纯的多态Cat对象,用来作为参数 Cat cat = new Cat(); //调用多态形式的a2的method2方法: a2.method2(cat); }}//定义动物类class Animal{ public void method() { System.out.println("动物的方法被调用了1"); } public void method2(Animal a) { System.out.println("动物的方法被调用了2"); } }//定义猫类class Cat extends Animal{ public void method() { System.out.println("猫的方法被调用了1"); } //当参数为父类类型时,可以传入子类对象,子类对象会自动提升成父类 public void method2(Animal a) { System.out.println("猫的方法被调用了2"); a.method(); } }
四接口
(1)当一个抽象类中的方法都是抽象的时候,java就提供了一种更抽象的表达方式,叫接口。
(2)接口的成员特点:
A:成员变量 是常量 默认修饰符 public static final
B:成员方法 抽象方法 默认修饰符 public abstract
(3)接口的特点:
A:接口用interface定义
B:实现类实现接口用implements标识
C:接口不能被实例化
(4)接口和类的关系
A:类与类的关系
继承关系,只能单继承,可以多层继承。
B:类与接口的关系
实现关系,可以单实现,也可以多实现。
还可以在继承一个类的同时,实现多个接口。
class A extends B implements C,D
C:接口与接口的关系
继承关系,可以单继承,也可以多继承。
(5)接口的思想特点(理解)
A:对外暴露的规则(USB接口)
B:程序的扩展功能(多态)
C:降低程序的耦合性(多态)
D:让类可以多实现
(6)接口和抽象类的区别
共性:都是不断抽取出来的抽象的内容。
A:成员特点
抽象类:
成员变量 可以变量,也可以常量
成员方法 可以抽象,也可以非抽象
构造方法 有
接口:
成员变量 只能是常量
成员方法 只能是抽象
构造方法 无
B:继承或者实现关系特点
a:类与类的关系
继承关系,只能单继承,可以多层继承。
b:类与接口的关系
实现关系,可以单实现,也可以多实现。
还可以在继承一个类的同时,实现多个接口。
c:接口与接口的关系
继承关系,可以单继承,也可以多继承。
C:设计区别
抽象类中定义的是体系的共性内容。表达的是:is a的关系。
接口中定义的是体系的扩展功能。表达的是:like a的关系。
代码实例
class Demo1_Interface { public static void main(String[] args) { MyClass mc = new MyClass(); mc.method(); mc.method2(); //接口多态,同样编译时,判断接口是否有该方法,运行时,运行子类对象重写的方法 MyInterface mi = new MyClass(); mi.method(); //mi.method2(); MyInterface2 mi2 = new MyClass(); //mi2.method(); mi2.method2(); }}//定义一个接口interface MyInterface{ //定义接口静态常量(必须赋值) public static final String name = "AngelaBaby"; //定义抽象方法method,强制要求子类实现 public abstract void method();} //定义一个接口interface MyInterface2{ //定义抽象方法method2,强制要求子类实现 public abstract void method2();} //接口多继承接口interface MyInterface3 extends MyInterface,MyInterface2 {}class MySuperClass{}//定义一个类实现两个接口(相当于继承了两个抽象类),要么重写所有的抽象方法,要么自己也是抽象类class MyClass extends MySuperClass implements MyInterface,MyInterface2{ //重写接口1的方法 public void method(){ System.out.println("hello world"); } //重写接口2的方法 public void method2() { System.out.println("hello world2"); }}
五如何实现一个继承体系
分析:由具体到抽象
实现:由抽象到具体
学习:抽象的内容,因为它定义的是共性内容。
使用:具体的内容,因为它才是具体实现,才具备更多的功能。
- 黑马程序员——抽象类,接口总结
- 黑马程序员——抽象类&接口
- 黑马程序员——抽象类&接口
- 黑马程序员—抽象类和接口
- 黑马程序员—抽象类和接口
- 黑马程序员——多态抽象类和抽象方法以及接口的总结
- 黑马程序员—面向对象(static,封装,继承,多态,内部类,抽象类,接口)总结
- 黑马程序员——继承,抽象,接口
- 黑马程序员——继承,抽象,接口
- 黑马程序员—继承,抽象,接口
- 黑马程序员——抽象类, 接口, Object类
- 黑马程序员——子父类、抽象类、接口、内部类
- 黑马程序员——抽象类和接口
- 黑马程序员——继承,抽象类,接口概述
- 黑马程序员——抽象类、接口和内部类
- 黑马程序员——抽象类与接口
- 黑马程序员——抽象类,接口与内部类
- 黑马程序员——抽象类和接口
- 黑马程序员——java学习笔记--字符串
- Java内存模型之运行时数据区域
- 文章标题
- 外网访问内网服务器设置方法+远程图形终端
- Android进阶之“再按一次返回键退出程序”实现
- 黑马程序员——抽象类,接口总结
- 合成和聚合的关系
- 3617 Best Cow Line【贪心】
- Android:Android2D绘图
- linux块设备列表
- WINCC7.0下用户归档的查询与导出——导出篇
- swift练习二
- 关于Linux系统的平均负载最全面介绍
- C语言及程序设计.第二十三课.项目3.两段函数求值