高级类特性-------抽象类

一、为什么使用抽象类
类用于描述现实生活中的一类事物,类中有属性有方法,并且方法都有方法体。
某种情况下,父类只能知道子类应该具备一个怎样的方法,但是不能明确知道子类如何实现该方法
例如:几何图形(多态练习),所有几何图形都应该具备一个计算面积的功能,但是不同几何图形计算面积的方式不同


Java 为上述问题提供了相应的解决办法:
Java中允许父类中只是提供一个方法的声明,不提供具体的实现具体的实现交给子类来完成,该方法称为抽象方法”
拥有一个或多个抽象方法的类,称为抽象类”

二.如何使用抽象:abstract
1.使用abstract修饰的类成为"抽象类"
①格式:访问控制修饰符 abstract class 类名{}
②拥有一个或多个抽象方法的类必须是抽象类
③抽象类中可以有非抽象方法
④抽象类中也可以没有抽象方法
⑤***抽象类不能创建实例
⑥抽象类中可以有构造器。
        目的:子类继承父类后,继承父类中所有的属性和方法,因此子类需要知道父类如何为对象进行初始化
2.使用abstract修饰的方法称为"抽象方法"
①格式:访问控制修饰符 abstract 返回值类型 方法名(参数列表);
②子类继承父类后,若重写了父类中”所有“的抽象方法,该类为具体类,可以创建实例
③子类继承父类后,若没有重写父类中”
所有“的抽象方法,该类必须为抽象类,不能创建实例

3.abstract 和 final 二者不能同时使用
    abstract 和 static 二者也不能同时使用
    abstract 和private 二者也不能同时使用
4.具体类和抽象类的区别?
抽象类可为具体类父类

 

/*
一.为什么使用抽象类
    类用于描述现实生活中的一类事物,类中有属性有方法,并且方法都有方法体。
    某种情况下,父类只能知道子类应该具备一个怎样的方法,但不能明确知道子类如何实现该方法
    例如:几何图形(多态),所有的几何图形都应具备一个计算面积的功能,但不同的几何图形计算面积的方式不同

java为上述问题提供了解决办法:
java中允许父类中只是提供一个方法的声明,不提供具体的实现
具体的实现交给子类来完成,该方法称为”抽象方法“
拥有一个或多个抽象方法的类,称为"抽象类"
二.如何使用抽象:abstract
1.使用abstract修饰的类成为"抽象类"
①格式:访问控制修饰符 abstract class 类名{}
②拥有一个或多个抽象方法的类必须是抽象类
③抽象类中可以有非抽象方法
④抽象类中也可以没有抽象方法
⑤***抽象类不能创建实例
⑥抽象类中可以有构造器。
        目的:子类继承父类后,继承父类中所有的属性和方法,因此子类需要知道父类如何为对象进行初始化
2.使用abstract修饰的方法称为"抽象方法"
①格式:访问控制修饰符 abstract 返回值类型 方法名(参数列表);
②子类继承父类后,若重写了父类中”所有“的抽象方法,该类为具体类,可以创建实例
③子类继承父类后,若没有重写父类中”所有“的抽象方法,该类必须为抽象类,不能创建实例

3.abstract 和 final 二者不能同时使用
    abstract 和 static 二者也不能同时使用
    abstract 和private 二者也不能同时使用
4.具体类和抽象类的区别?
抽象类可为具体类父类
 */

public class AbstractTest {
    public static void main(String[] args) {
        Chinese c1=new Chinese();//本态
        c1.speak();

        Person1 p1=new Chinese();//多态
        p1.speak();//虚拟方法调用
    }
}
abstract class Person1{
    private String name;
    private  int age;
    public Person1(){

    }
    public Person1(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //人都应该具备一个说话的功能,但是不同的人说话的方式不同
    public abstract void speak();
    public abstract void show();
}
class Chinese extends Person1{
    //public abstract void speak();重写方法
    public  void speak(){
        System.out.println("中国人说汉语");
    }
    public void show(){
        System.out.println("中国人");
    }
}
abstract class American extends Person1{//抽象类
    public void speak(){
        System.out.println("美国人说英语");
    }
    //public abstract void show();
}

Exer: 

 

public class AbstractExer {
    public static void main(String[] args) {
        //Frock f1=new Frock();不能创建frock对象
        Shirt s1=new Shirt();
        s1.setSize(1.5);
        System.out.println(s1.calcArea());
        Frock p1=new Shirt();
        p1.setSize(1.5);
        System.out.println(p1.calcArea());
    }
}
abstract class Frock{
    private double size;

    public Frock() {
    }
    public Frock(double size) {
        this.size = size;
    }
    public double getSize() {
        return size;
    }
    public void setSize(double size) {
        this.size = size;
    }

    public abstract double calcArea();

    @Override
    public String toString() {
        return "Frock{" +
                "size=" + size +
                '}';
    }
}
class Shirt extends Frock{
    public double calcArea(){
        return getSize()*1.3;
    }
}

实验:

 

package Test;

public abstract class Employee {
    private String name;
    private int number;
    private MyDate birthday;
    public Employee() {
    }
    public Employee(String name, int number, MyDate birthday) {
        this.name = name;
        this.number = number;
        this.birthday = birthday;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public MyDate getBirthday() {
        return birthday;
    }
    public void setBirthday(MyDate birthday) {
        this.birthday = birthday;
    }
    public abstract double earnings();

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", number=" + number +
                ", birthday=" + birthday +
                '}';
    }
}

 

package Test;

public class SalariedEmployee extends Employee {
    private double monthlySalary;
    public SalariedEmployee() {
    }
    public SalariedEmployee(String name, int number, MyDate birthday, double monthlySalary) {
        super(name, number, birthday);
        this.monthlySalary = monthlySalary;
    }

    public double getMonthlySalary() {
        return monthlySalary;
    }

    public void setMonthlySalary(double monthlySalary) {
        this.monthlySalary = monthlySalary;
    }

    public double earnings() {
        return monthlySalary;
    }

    @Override
    public String toString() {
        return "SalariedEmployee{" +super.toString()+
                "monthlySalary=" + monthlySalary +
                '}';
    }
}
package Test;

public class HourlyEmployee extends Employee {
    private int wage;
    private int hour;

    public HourlyEmployee() {
    }
    public HourlyEmployee(String name, int number, MyDate birthday, int wage, int hour) {
        super(name, number, birthday);
        this.wage = wage;
        this.hour = hour;
    }

    public int getWage() {
        return wage;
    }

    public void setWage(int wage) {
        this.wage = wage;
    }

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        this.hour = hour;
    }

    @Override
    public double earnings() {
        return wage*hour;
    }

    @Override
    public String toString() {
        return "HourlyEmployee{" +super.toString()+
                "wage=" + wage +
                ", hour=" + hour +
                '}';
    }
}
package Test;

import java.util.Scanner;

public class PayrollSystem {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        Employee[] employees=new Employee[5];
        employees[0]=new SalariedEmployee("张三",101,new MyDate(2004,5,6),9000);
        employees[1]=new HourlyEmployee("李四",102,new MyDate(1999,4,8),800,8);
        employees[2]=new SalariedEmployee("王五",103,new MyDate(1994,7,15),20000);
        employees[3]=new HourlyEmployee("小六",104,new MyDate(1995,11,20),500,5);
        employees[4]=new SalariedEmployee("大七",105,new MyDate(2001,4,22),2000);

        System.out.println("输入月份!");
        int month=scan.nextInt();

        for (int i = 0; i < employees.length; i++) {
            System.out.println(employees[i]);
            System.out.println("您的工资为:"+employees[i].earnings());
            if (month==employees[i].getBirthday().getMonth()){
                System.out.println("生日奖励:100"+" 总工资为:"+employees[i].earnings()+100);
            }
        }

    }
}
package Test;

public class MyDate {
    private int year;
    private int month;
    private int day;
    public MyDate(){

    }

    public MyDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    @Override
    public String toString() {
        return year+"年"+month+"月"+day+"日";
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文是一个word讲义 介绍了 Figure circle Rectangle等类在接口中计抽象类中的用法 抽象类 接口多态 public class Polymorphism { public static void main(String args[]) { Triangle t=new Triangle(5.0,2.0); t.show_area(); Rectangle r=new Rectangle(3.0,4.0); r.show_area(); Circle c=new Circle(10.0); c.show_area(); } } abstract class Figure { protected double x=10.0,y=5.0; abstract void show_area(); } class Triangle extends Figure { Triangle(double a,double b) { x=a; y=b; } void show_area() { System.out.println("triangle:"+(0.5*x*y)); } } class Rectangle extends Figure { Rectangle(double a,double b) { x=a; y=b; } void show_area() { System.out.println("rectangle:"+(x*y)); } } class Circle extends Figure { Circle(double a){x=a;} final double pi=3.1416; void show_area() { System.out.println("circle:"+(pi*x*x)); } } package inf; interface Figure { abstract double area(); } //Rectangle.java package inf; /** * * @author tai */ public class Rectangle implements Figure{ double width,height; public Rectangle(double w,double h) //构造方法 { width=w; height=h; } public double area(){ return (width * height); } } //Triangle.Java package inf; /** * * @author tai */ class Triangle implements Figure { double a; double b; double c; Triangle(double a,double b,double c) { this.a=a; this.b=b; this.c=c; } public double area() { double p=(a+b+c)/2; return Math.sqrt(p*(p-a)*(p-b)*(p-c)); } } //Circle.java package inf; /** * * @author tai */ class Circle implements Figure { double radius; Circle(double radius) { this.radius=radius; } public double area() { return Math.PI*radius*radius; } } 测试一: public class Test4 { public static void main(String args[]) { Triangle t=new Triangle(5.0,6.0,7.0); System.out.println("三角形面积="+t.area()); Rectangle r=new Rectangle(3.0,4.0); System.out.println("矩形面积="+r.area()); Circle c=new Circle(10.0); System.out.println("圆的面积="+c.area()); } } 测试二: package inf; import javax.swing.JOptionPane; public class Test5 { public static double totalArea1(Figure f[]) { double totalArea=0; for(Figure f1:f){ totalArea+=f1.area(); } return totalArea; } public static void main(String args[]) { Figure f[] =new Figure[3];//为什么 f[0]=new Triangle(5.0,6.0,7.0); f[1]=new Rectangle(6.0,87.0); String input=JOptionPane.showInputDialog("输入圆的半径"); Double r=Double.parseDouble(input); f[2]=new Circle(r); double totalArea=0; for(Figure f1:f){ totalArea+=f1.area(); } JOptionPane.showMessageDialog(null,"totalarea="+totalArea); JOptionPane.showMessageDialog(null,"totalarea1="+totalArea1(f)); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值