栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java基础学习day14【谷】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java基础学习day14【谷】

Java基础学习day14 abstract关键字的使用

1.abstract:抽象的
2.abstract可以用来修饰的结构:类、方法
3.abstract修饰类:抽象类

此类不能实例化
抽象类中一定有构造器,
便于子类实例化时调用(涉及:子类对象实例化的全过程)
开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
4.abstract修饰方法:抽象方法
抽象方法只有方法的声明,没有方法体
包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。

若子类重写了父类中的所有的抽象方法后,此子类方可实例化
若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰

abstract注意点

abstract不能去修饰方法和构造器

abstract不能修饰静态方法、私有方法、final方法、final类

练习

编写一个Employee类,声明为抽象类,
包含如下三个属性:name,id,salary。
提供必要的构造器和抽象方法:wok()
对于Manager类来说,他既是员工,还具有奖金(bonus))的属性。
请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问。

抽象父类Employee

public abstract class Employee {
    private String name;
    private int id;
    private int salary;

    public Employee(String name, int id, int salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public abstract void work();
}

子类CommonEmployee

public class CommonEmployee extends Employee{

    public CommonEmployee(String name, int id, int salary) {
        super(name, id, salary);
    }

    @Override
    public void work() {
        System.out.println("普通员工正在工作...");

    }
}

子类Manager

public class Manager extends Employee{
    private int bonus;

    public Manager(String name, int id, int salary, int bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    @Override
    public void work() {
        System.out.println("我是经理,我正在工作...我的奖金是:"+bonus);
    }
}
练习二

编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个
Employee对象的生日,则将该雇员的工资增加100元。
实验说明:
(1)定义一个Employee类,该类包含:
private成员变量name,number,birthday,其中birthday为yDate类的对象;
abstract方法earnings():
toString()方法输出对象的name,number和birthday。
(2)MyDate类包含:
private成员变量year,month,day;
toDateString()方法返回日期对应的字符串:Xxxx年xx月x日
(3)定义SalariedEmployee类继承Employee:类,实现按月计算工资的员工处
理。该类包括:private成员变量monthlySalary;
实现父类的抽象方法earnings(),该方法返回monthlySalary值;toString()方法输
出员工类型信息及员工的name,number,birthday。

(4)参照SalariedEmployee类定义HourlyEmployee类,实现按小时计算工资的
员工处理。该类包括:
private成员变量wage和hour;
实现父类的抽象方法earnings(),该方法返回wage*hour值;
toString()方法输出员工类型信息及员工的name,number,birthday。
(5)定义PayrollSystem类,创建Employee变量数组并初始化,该数组存放各
类雇员对象的引用。利用循环结构遍历数组元素,输出各个对象的类
型,name,number,birthday.,以及该对象生口。当键盘输入本月月份值时,如果本
月是某个Employee对象的生口,还要输出增加工资信息。

public abstract class Employee {
    private String name;
    private int number;
    private MyDate birthday;
    public abstract int earning();

    public Employee(String name, int number, MyDate birthday) {
        this.name = name;
        this.number = number;
        this.birthday = birthday;
    }

    public MyDate getBirthday() {
        return birthday;
    }

    public void setBirthday(MyDate birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + ''' +
                ", number=" + number +
                ", birthday=" + birthday.toDateString() +
                '}';
    }
}
public class MyDate {
    private int year;
    private int month;
    private int day;

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

    public int getMonth() {
        return month;
    }

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

    public String toDateString() {
        return year+"年"+month+"月"+day+"日";
    }
}
public class SalariedEmployee extends Employee{
    private int monthlySalary;

    public SalariedEmployee(String name, int number, MyDate birthday) {
        super(name, number, birthday);
    }

    public SalariedEmployee(String name, int number, MyDate birthday, int monthlySalary) {
        super(name, number, birthday);
        this.monthlySalary = monthlySalary;
    }

    @Override
    public int earning() {
        return monthlySalary;
    }

    public String toString() {
        return  super.toString();
    }
}
public class HourlyEmployee extends Employee{
    private int wage;
    private int hour;

    public HourlyEmployee(String name, int number, MyDate birthday) {
        super(name, number, birthday);
    }

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

    @Override
    public int earning() {
        return wage*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;
    }

    public String toString() {
        return  super.toString();
    }
}
public class PayrollSystem {
    public static void main(String[] args) {
        //获取月份方式一
//        Scanner scanner = new Scanner(System.in);
//        System.out.println("请入当前月份:");
//        int month=scanner.nextInt();
        //获取月份方式二
        Calendar instance = Calendar.getInstance();
        int month = instance.get(Calendar.MONTH);
        month++;
        Employee[] employees = new Employee[2];
        employees[0] = new SalariedEmployee("zs",1001,new MyDate(2001,7,5),13000);
        employees[1] = new HourlyEmployee("ls",1002,new MyDate(2001,5,5),240,60);
        for (int i = 0; i < employees.length; i++) {
            System.out.println(employees[i].toString());
            if(employees[i].getBirthday().getMonth()==month){
                int earning = employees[i].earning();
                System.out.println("工资为"+(earning+100));
            }
        }
    }
}
接口的使用

1.接口使用interface来定义
2.Java中,接口和类是并列的两个结构
3.如何定义接口:定义接口中的成员
3.1JDK7及以前:只能定义全局常量和抽象方法

​ 全局常量:public static final的.但是书写时,可以省略不写
​ 抽象方法:public abstract的
​ 3.2JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
4.接口中不能定义构造器的!意味着接口不可以实例化
5.Java开发中,接口通过让类去实现(implements)的方式来使用.
如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
6.Java类可以实现多个接口—>弥补了Java单继承性的局限性
格式:class AA extends BB implements CC,DD,EE
7.接口与接口之间可以继承,而日可以多继承


8.接口的具体使用,体现多态性

9.接口实际上可以看成是一个规范

接口使用也满足多态性

接口,实际上就定义了一种规范

开发中,体会面向接口编程

面试题:抽象类与接口有哪些异同

代理模式

public interface Star {
    void confer();//面谈
    void signContract();//签合同
    void bookTicket();//订票
    void sing();//唱歌
    void pay();//给钱
}
public class RealStar implements Star {
    @Override
    public void confer() {

    }

    @Override
    public void signContract() {

    }

    @Override
    public void bookTicket() {

    }

    @Override
    public void sing() {
        System.out.println("高有道唱模拟他....");
    }

    @Override
    public void pay() {

    }
}
public class ProxyStar implements Star{
    private Star star;

    public ProxyStar(Star star) {
        this.star = star;
    }

    @Override
    public void confer() {
        System.out.println("经纪人面试");
    }

    @Override
    public void signContract() {
        System.out.println("经纪人签合同");
    }

    @Override
    public void bookTicket() {
        System.out.println("经纪人订票");
    }

    @Override
    public void sing() {
        star.sing();
    }

    @Override
    public void pay() {
        System.out.println("经纪人收款");
    }
}
public class ProxyTest {
    public static void main(String[] args) {
        ProxyStar proxyStar = new ProxyStar(new RealStar());
        proxyStar.confer();
        proxyStar.signContract();
        proxyStar.bookTicket();
        proxyStar.sing();
        proxyStar.pay();
    }
}

知识点1:接口中定义的静态方法,只能通过接口来调用

知识点2:通过实现类对象可以调用接口中默认的方法

如果实现类重写了接口中的方法,调用时,仍然调用重写后的方法

知识点3:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写的情况下,默认调用的是父类中同名同参数的方法

类优先原则

知识点4:如果子类(或实现类)继承了多个接口,而多个接口中定义了同名同参数的方法,在没有重写的情况下将会报错,----》接口冲突

这就需要我们必须在实现类中重写此方法

知识点5:如何在子类(或实现类)的方法中调用父类接口中被重写的方法

super.method();//父类

//调用接口中的默认方法

子类.super.方法();

内部类

类的内部成员之五:内部类
1ava中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
2,内部类的分类:成员内部类(静态、非静态)VS局部内部类(方法内、代码块内、构造器内)
3.成员内部类:
一方面,作为外部类的成员:

调用外部类的结构
可以被static修饰
可以被4种不同的权限修饰
另一方面,作为一个类:
类内可以定义属性、方法、构造器等
可以被Final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
可以被abstract修饰

4.关注如下的3个问题
4.1如何实例化成员内部类的对象
4.2如何在成员内部类中区分调用外部类的结构
4.3开发中局部内部类的使用:返回一个实现了XXX接口的类的对象

public class Person {
    private String name;
    private int age;
    class man{
        public void hello(){
            System.out.println("你好!!!!");
            System.out.println(name);
            System.out.println(Person.this.name);
        }
    }
    static class woman{
        private String name;
        public void method(){
            System.out.println("method1....");
        }
    }

    public static void main(String[] args) {
        //非静态内部类
        Person person = new Person();
        man man = person.new man();
        man.hello();
        //静态内部类
        Person.woman woman=new Person.woman();
        woman.method();
    }
    public Comparable getComparable(){
        //方式1

        //方式二
        return new Comparable() {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };

    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1021158.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号