Java面向对象--接口和多态

final 关键字

最终修饰符 可以修饰 类 方法 变量

被final修饰后不能被继承 重写 二次赋值
修饰类时 该类不可以被继承
修饰方法时 该方法不能被重写
修饰变量时, 该变量只能赋值一次, 不可以二次赋值 是常量
修饰引用变量时, 地址值不能改变 但对象中的属性值可以改变
修饰成员变量时, 必须在类中显性赋值 或 在所有构造方法中对其赋值

接口

接口是功能的集合 描述的是功能 接口中都是抽象方法(JDK1.8之前)
定义格式

public interface 接口名{
	抽象方法;
}

接口的使用

1.接口不能创建对象
2.使用类实现接口
3.重写抽象方法
4.创建实现类对象 调用方法

实现的动作类似继承 就是关键字不同

public class 类  implements 接口{
	重写方法
}

接口的成员特点

接口没有构造方法
接口中的成员变量 被public static final修饰 是常量
接口中的成员方法 被public abstract修饰

接口的特点

类与类 单继承
类与接口 多实现
接口与接口 多继承
类可以在继承一个类的同时 实现多个接口

接口与抽象类的区别

成员区别
	构造方法
		接口没有构造方法
		抽象类有构造方法 给子类使用
	成员变量 
		接口没有变量 只有常量
		抽象类既可以有变量 也可以有常量
	成员方法
		接口中的方法都是抽象的 
		抽象类中 既可以有抽象方法 也可以有具体的方法
	思想的区别
		抽象类描述的是一类事物的共性内容
		接口描述的是功能

多态

多态的前提

1.继承或者是实现关系
2.需要有方法重写

多态的格式

父类引用指向子类对象

具体类  变量 = new 子类对象();
抽象类  变量 = new 子类对象();
接口  变量 = new 实现类对象();

多态后访问的成员特点

成员变量
	编译时 到父类中找 如果有编译通过 没有报错
	运行时  打印的父类成员变量的值
	编译时  看左边
	运行时  看左边 
成员方法
	编译时 到父类中找 如果有编译通过 没有报错
	运行时  子类重写后的方法 
	编译时 看左边
	运行时 看右边
多态后 一切都是父类的表现形式 只有方法运行的子类重写后的方法.

向上转型和向下转型

// 向上转型
// 多态本身就是向上转型
Fu fz = new Zi();
// 向下转型
// 向上转型后 不能访问子类特有功能
// 要想访问 需要向下转型
Zi zf = (Zi)fz;

// 需要注意
Fu fu = new fu();
Zi  zi = (Zi)fu; //抛运行时异常  ClassCastException 类型转换异常

instanceof关键字

判断某个对象是否属于某种类型 是返回true, 否返回false

boolean b = 对象 instanceof 类型;
if(对象 instanceof 类型){}

练习

员工类
	属性
		id
		name
		基本工资
	行为
		计算工资  抽象

经理类
	属性
		id
		name
		基本工资
		管理工资
	行为 
		计算工资  基本工资+管理工资
程序员
	属性
		id
		name
		基本工资
		项目奖金
	行为
		计算工资  基本工资+项目奖金


公司类
	行为
		查看员工工资(员工){
			员工的工号:38250
			员工的姓名:柳岩
			员工的职位:经理
			员工的工资:11111.00
		}

练习

// Employee.java
public abstract class Employee {
    String id;
    String name;
    private double salary;

    public Employee() {
    }

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

    public abstract double calculateSalary();

    public String getName() {
        return name;
    }


    public double getSalary(){
        return salary;
    }
}

// Manager.java
public class Manager extends Employee{
    private double additionalSalary;

    public Manager() {
    }

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

    public double getAdditionalSalary() {
        return additionalSalary;
    }

    public void setAdditionalSalary(double additionalSalary) {
        this.additionalSalary = additionalSalary;
    }

    @Override
    public double calculateSalary() {
        return super.getSalary() + getAdditionalSalary();
    }
}


// Programmer.java
public class Programmer extends Employee{
    private double projectSalary;

    public double getProjectSalary() {
        return projectSalary;
    }

    public Programmer() {
    }

    public Programmer(String id, String name, double salary, double projectSalary) {
        super(id, name, salary);
        this.projectSalary = projectSalary;
    }

    public void setProjectSalary(double projectSalary) {
        this.projectSalary = projectSalary;
    }

    @Override
    public double calculateSalary() {
        return super.getSalary() + getProjectSalary();
    }
}
// Company.java
public class Company {
    public void lookEmployeeSalary(Employee employee) {
        String position = "员工";
        if (employee instanceof Manager) {
            position = "经理";
        } else if (employee instanceof Programmer){
            position = "程序员";
        }
        System.out.println("员工的工号: " + employee.id);
        System.out.println("员工的姓名: " + employee.name);
        System.out.println("员工的职位: " + position);
        System.out.println("员工的工资: " + employee.calculateSalary());
    }
}
public class Demo {
    public static void main(String[] args) {
        Company company = new Company();
        company.lookEmployeeSalary(new Manager("001", "经理一号",20000, 3000));
        System.out.println("============================");
        company.lookEmployeeSalary(new Programmer("002", "程序员一号",20000, 3000));

    }
}
0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • 谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?   Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“一处编译,处处运行”(Write once,run...

  • JavaWeb综合案例 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 视频教程(P154~P163) 功能列表 环境搭建...

  • 1 引入Synchronized Synchronized是java虚拟机为线程安全而引入的。 互斥同步是一种最常见的并发正确性的保障手段。同步是指在多个线程并发访问共享数据时,保证共享数据在同一个...

  • javaweb服务分为两个部分,一部分是web服务端,另一部分就是你调用的客户端了。首先我说下实现web服务的简单思路: 一、服务器端实现:1.添加webservice  jar包 spring支持2...

  • 前言:我们都知道,实现分页需要三个步骤。第一,确定页大小(每页显示的数据量)。第二,计算显示的总页数。第三,写分页的sql语句。这三步已经在昨天的推文中详细说明,需要的可以点击这里快速浏览:javaw...

  • Java虚拟机   之所以引入关于JVM的篇章,是发现多数项目发生的线上问题很大的几率源自JVM调优配置不当引起。对JVM的内存模型、GC垃圾回收机制、调优方式有一个系统化的了解后,可以快速处理或避免...

  • 又抛异常了?可能你对Java的异常体系还没了解到位 什么?这是谁的代码,抛出了大量的异常,这下全完了!写个代码抛出异常让人头疼,这篇文章就带你了解一下让你头疼的代码异常 异常的捕捉 所有...

  • 代码示例:java.lambda.LambdaExpression 1 本质 lambda表达式本质上是对匿名内部类实例的一种简化写法。 1.1 案例 有以下List对象: List list ...

  • 自定义注解 1、自定义注解

  • 您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 多数码农在开发的时候,要么处理同步应用,要么处理异步。但是如果能学会使用CompletableFuture,就会具备一种神奇的能力:将同步变为...

  • 以下是一个排查 Java 工程文件的 .gitignore 文件示例: # Java 编译器生成的文件 *.class # Maven 生成的文件夹 target/ # Eclipse 生成的文件...

  • 1. Java飞行记录器 1.1. Java Flight Recorder,JFR 1.1.1. 最初是BEA公司的JRockit JVM的功能 1.1.2. 在JDK 8中,只有Oracl...

  • 输入方式 必须引入的包java.util.* list转数组的方式: int[] nums = list.stream().mapToInt(Integer::intValue).toArray(...

  • 1. 通用规则 1.1. 不要假设问题出在堆空间 1.2. 谨慎地创建对象并尽快丢弃它们 1.3. 使用更少的内存是提高垃圾回收器效率最好的办法 1.3.1. 减少内存使用是一个重要的目标 1.3.2...

  • 前言 本文为我搜集的根据模板导出PDF的方法整理而来,所以贴了好多帖子的链接。有的方法仅适合特殊的业务场景,可以根据业务需求选择合适的方法。写的不好请轻喷。 思路一:直接导出pdf 使用itext模板...

  • Java 优化:读取配置文件 "万能方式" 跨平台,动态获取文件的绝对路径 每博一文案 往事不会像烟雾似的飘散,将永远像铅一般沉重地浇铸在心灵的深处。 不过,日常生活的纷繁不会让人专注地沉湎于自己的...

  • 1. Java 8之前的库对日期和时间的支持非常不理想 2. TemporalField接口 2.1. 定义了如何访问temporal对象某个字段的值的接口 2.2. ChronoField枚举 2....

  • 1、车牌识别简介 车牌识别分为车牌检测与识别,检测模型一般需要检查车牌的位置识别模型一般为识别车牌号及车牌的颜色类型等,目前有较多的深度学习模型能支持,这里就不详细说了。 自动识别车辆车牌信息...

  • Java 学习(一) - 开发前的准备 前言 由于一些项目上的需要,我得学习一下 Java 这门语言(主要是想写Android),本人并非0基础,至少在上个学期学习了一门必修的程序设计(C语言),所...

  • 随着它进入第三个十年,Java仍然是最流行的开发语言之一。它是作为一种“编写一次,随处运行”的语言开发的,可以为开发人员的代码提供更多的通用性和灵活性。 现在,可扩展性是所有领域的 Web 开发人...