【达内课程】面向对象之抽象类
文章目录
- 抽象类的概念
- 举例1:绘制图形项目修改
- 举例2:员工类
抽象类的概念
抽象类的基本概念
1、很多具有相同特征和行为的对象可以抽象为一个类;很多具有相同特征和行为的类可以抽象为一个抽象类。
2、使用abstract
关键字声明的类为抽象类
抽象类作用
1、为子类提供通用代码
2、为子类提供通用方法的定义
子类向上转型之后可以调用父类的这个通用方法(当然执行的时候是执行子类的方法),如果不定义这个抽象方法(所谓的抽象方法理解起来非常简单,就是没有完成的方法),只能向下转型成子类再调用子类中方法
抽象类的规则
a、抽象类可以没有抽象方法,有抽象方法的类必须是抽象类
b、非抽象类继承抽象类必须实现所有抽象方法
c、抽象类可以继承抽象类,可以不实现父类抽象方法。
d、抽象类可以有方法实现和属性
e、抽象类不能被实例化
f、抽象类不能声明为final
g、抽象类可以有构造方法
举例1:绘制图形项目修改
这个例子是根据上一章的绘制图形项目进行的修改,传送门:【达内课程】面向对象之多态
前情回顾:
我们有图形类 Shape(图形),它的子类有 Line(线)、Circle(圆)、Square(方)
Shape:draw(画图)、clean(清除)
|-Line:有自己的 draw 方法。有单独的 length 方法
|-Circle:有自己的 draw 方法 |-Square:有自己的 draw 方法
Shape类修改
public abstract class Shape {public abstract void draw(TextView view);public void clean(TextView view) {view.setText("");}
}
其中继承 Shape 类 Circle、Line、Square 都不能使用 super.draw(view);
了,所以应该在代码中去掉,例如 Circle 类:
public class Circle extends Shape {@Overridepublic void draw(TextView view) {//super.draw(view);view.setText("o");}
}
修改 MainActivity 中的 doClick 方法,其余点击事件都没有变,只不过由于抽象类不能创建实例,所以修改了 button1 的点击事件
public void doClick(View view) {switch (view.getId()) {case R.id.button1://f(new Shape());textView.setText("抽象类不能创建实例");break;case R.id.button2:f(new Line());break;......}}
运行结果:
这里重点看下 f(Shape shape)
方法,重点都写在注释里了:
private void f(Shape shape) {//参数对象,保存到成员变量currentShape = shape;//调用抽象方法//执行的是子类实现的draw方法shape.draw(textView);//向上转型后只能访问父类定义的通用成员//不能访问子类特有成员//shape.length();if (shape instanceof Line) {Line line = (Line) shape;line.length(textView);}}
举例2:员工类
我们有一个抽象的员工类 Employee,抽象方法有 工资(gongzi()
)、奖金(jiangjin()
)。还有一个返回综合工资的方法(zonghe()
)
程序员类 Programmer、经理类 Manager 继承了这个抽象方法
Employee
|-Programmer
|-Manager
Employee
public abstract class Employee {public abstract double gongzi();public abstract double jiangjin();public double zonghe() {//抽象方法调用//执行具体子类中实现的方法return gongzi() + jiangjin();}
}
Programmer
public class Programmer extends Employee {@Overridepublic double gongzi() {return 8000;}@Overridepublic double jiangjin() {return 1000;}
}
Manager
public class Manager extends Employee {@Overridepublic double gongzi() {return 10000;}@Overridepublic double jiangjin() {return 3000;}
}
xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doClick"android:text="Employee" /><Buttonandroid:id="@+id/button2"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doClick"android:text="Programmer" /><Buttonandroid:id="@+id/button3"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="doClick"android:text="Manager" /><TextViewandroid:id="@+id/text"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#222222"android:textSize="20sp"android:gravity="center" />
</LinearLayout>
MainActivity
package com.example.testapplication;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {Button button1;Button button2;Button button3;TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.text);button1 = (Button) findViewById(R.id.button1);button2 = (Button) findViewById(R.id.button2);button3 = (Button) findViewById(R.id.button3);}public void doClick(View view) {switch (view.getId()) {case R.id.button1:textView.setText("抽象类不能创建实例");break;case R.id.button2:f(new Programmer());break;case R.id.button3:f(new Manager());break;}}private void f(Employee employee) {textView.setText("");textView.append(employee.gongzi() + "\n");textView.append(employee.jiangjin() + "\n");textView.append(employee.zonghe() + "\n");}
}
运行程序:
【达内课程】面向对象之抽象类相关推荐
- 【达内课程】面向对象之多态
文章目录 定义和作用 如何实现多态 例子1:Human 类 instanceof 关键字 例子2:Point3D 类 例子3:绘制图形 类型转换 定义和作用 多态的定义 面向对象的多态性,即" ...
- php面向对象代码_PHP面向对象之抽象类详解(代码实例)
[摘要] PHP即"超文本预处理器",是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 ...
- Java自学笔记——Java面向对象——04.抽象类、接口、内部类
Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...
- Java面向对象编程——抽象类和接口
Java面向对象编程--抽象类和接口 定义类的过程就是抽象和封装的过程,而抽象类与接口则是对实体类进行更高层次的抽象,进定义公共行为和特征. 抽象类: 如果一个类没有足够的信息去描述一个具体的对象,那 ...
- 设计一个学生类Student,包括数据成员:姓名、学号、二门课程(面向对象程序设计、高等数学)的成绩。
(1).设计一个学生类Student,包括数据成员:姓名.学号.二门课程(面向对象程序设计.高等数学)的成绩. (2).创建一个管理学生的类Management,包括实现学生的数据的增加.删除.修改. ...
- Java面向对象之抽象类与接口
Java面向对象之抽象类与接口 ⚡️前言⚡️ 本篇文章为面向对象部分的第三篇文章,前两篇文章见链接包和继承.组合与多态.抽象类和接口都是继承关系中父类的更进一步,结合前两篇文章来阅读更易理解掌握.
- 【达内课程】面向对象之封装
文章目录 封装的概念 封装的步骤 封装的概念 封装的概念 封装性是面向对象思想的三大特征之一,封装就是隐藏实现细节,仅对外提供访问接口.实现细节部份包装.隐藏起来的方法. 封装的好处 模块化.信息隐藏 ...
- 【达内课程】面向对象简介
文章目录 概念了解 举例说明:创建一个Soldier类 举例说明:创建一个FlashLight类 举例说明:创建一个Car类 类中包含的变量 类中的方法 概念了解 Java是一种面向对象的程序设计语言 ...
- java 抽象类对象_Java基础___面向对象__抽象类
抽象类 在面向对象的概念中,所以的对象都是通过类来描绘的,但是反过来,并不是多余类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对象 ...
最新文章
- 你是别人眼中的废物产品经理吗?
- ajax返回的是流如何转换为pdf,如何在AJAX请求成功响应中返回PDF文件
- 编写手机端自适应页面案例,springMVC代码,SpringMVC上传代码,去掉input框中原有的样式,使ios按钮没有圆角,css中的border-radius类似
- Spring-boot配置JedisShardInfo
- 问题 E: Search Problem (II)
- 基础入门_Python-模块和包.深入SQLAlchemy之事务回滚与反射还原对象?
- phpmyadmin安装配置以及相关问题
- 关于Location of the Android SDK has not been setup in the preferences的解决方法
- oracle 基本dos命令,Oracle 常用 Dos命令
- Topcoder SRM 656 (Div.1) 250 RandomPancakeStack - 概率+记忆化搜索
- 解决:The proxy server received an invalid response from an upstream server
- 专访唐宇迪博士:我是如何迈入同济大学校园的?浅谈人工智能,未来数据挖掘和计算机视觉是风口
- mysql to excel 插件_在Excel中操作MySQL数据库插件MySQL for Excel
- 基于JAVA的GUI编程的的迷宫游戏 2020-12-15
- 3ds Max 实验十 熟悉材质编辑器
- 技巧分享篇---如何从GitHub上下载某个项目中单个文件的方法
- 新功能!微信可以开“小号”了
- transforms及Compose
- MATLAB——textscan
- 物理五大信道浅聊PRACH、PUCCH、PUSCH、PDCCH、PDSCH