注册

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");
}
}

0 个评论

要回复文章请先登录注册