JAVA面向对象之抽象类
文章目录
抽象类的概念
抽象类的基本概念
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 {
@Override
public 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 {
@Override
public double gongzi() {
return 8000;
}
@Override
public double jiangjin() {
return 1000;
}
}
Manager
public class Manager extends Employee {
@Override
public double gongzi() {
return 10000;
}
@Override
public 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">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="Employee" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="Programmer" />
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="doClick"
android:text="Manager" />
<TextView
android: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;
@Override
protected 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");
}
}