详尽分享继承和多态对应的几类问题

简介: 详尽分享继承和多态对应的几类问题

继承和多态对应的几类问题

员工薪资问题:

例:

某公司的雇员分为以下若干类: Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份。方法:void getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励1000元。 SalariedEmployee:Employee的子类,拿固定工资的员工。属性:月薪 HourlyEmployee:Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。属性:每小时的工资、每月工作的小时数 SalesEmployee:Employee的子类,销售人员,工资由月销售额和提成率决定。属性:月销售额、提成率 BasePlusSalesEmployee:SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。属性:底薪。

1 //定义一个父类,包含name和birthday属性

2 public class Employee {办法

3 public String name;

4 public int birthday;

5 public void getSalary(int month){

6 }

7 }

8 //定义一个子类,第一类员工的结算工资办法

9 class SalariedEmployee extends Employee{

10 public double yx;

11 @Override

12 public void getSalary(int month){

13 if(month==birthday){

14 System.out.println(name+month+"月份工资为"+(yx+1000)+"元");

15 }else{

16 System.out.println(name+month+"月份工资为"+yx+"元");

17 }//代码效果参考:http://www.ezhiqi.com/bx/art_787.html

18 }

19 }

20 //定义一个子类,第二类员工的结算工资办法

21 class HourlyEmployee extends Employee {

22 public double hgz;

23 public double hour;

24 @Override

25 public void getSalary(int month) {

26 double gz = (hour < 160) ? (hour hgz) : (hour - 160) 1.5 + (160 hgz);

27 if (month == birthday) {

28 System.out.println(name + month + "月份工资为" + (gz + 1000) + "元");

29 } else {

30 System.out.println(name + month + "月份工资为" + gz + "元");

31 }

32 }

33 }

34 //定义一个子类,第三类员工的结算工资办法

35 class SalesEmployee extends Employee{

36 public double xse;

37 public double tcl;

38 @Override

39 public void getSalary(int month){

40 double gz=(month==birthday)?(xsetcl+1000):(xsetcl);

41 System.out.println(name+month+"月份工资为"+gz+"元");

42 }

43 }

44 //定义一个子类,第四类员工的结算工资办法

45 class BasePlusSalesEmployee extends SalesEmployee{

46 public double dx;

47 @Override

48 public void getSalary(int month){

49 double gz=(month==birthday)?(xse+tcl+dx+1000):(xse+tcl+dx);

50 System.out.println(name+month+"月份工资为"+gz+"元");

51 }

52 }

53 //定义一个测试类,并创建四个对象进行实例化操作

54 class Test2 {

55 public static void main(String【】 args) {

56 SalariedEmployee e1 = new SalariedEmployee();

57 e1.name = "张三";

58 e1.birthday = 1;

59 e1.yx = 3000;

60

61 HourlyEmployee e2 = new HourlyEmployee();

62 e2.name = "李四";

63 e2.birthday = 2;

64 e2.hgz = 10;

65 e2.hour = 160;

66 SalesEmployee e3 = new SalesEmployee();

67 e3.name = "王五";

68 e3.birthday = 3;

69 e3.xse = 100000;

70 e3.tcl = 0.1;

71 BasePlusSalesEmployee e4 = new BasePlusSalesEmployee();

72 e4.name = "赵六";

73 e4.birthday = 4;

74 e4.xse = 100000;

75 e4.tcl = 0.1;

76 e4.dx = 2000;

77 //打印四个人的名字

78 Employee【】 e = {e1, e2, e3, e4};

79 for (Employee em : e) {

80 System.out.println(em.name);

81 }

82 //打印这四人12个月来每个月的薪资情况

83 for (int i = 1; i < 13; i++) {

84 System.out.println("第" + i + "月工资表");

85 e1.getSalary(i);

86 e2.getSalary(i);

87 e3.getSalary(i);

88 e4.getSalary(i);

89 }

90 }

91 }//代码效果参考:http://www.ezhiqi.com/zx/art_4810.html

在多态中,涉及到将子类对象当做父类类型使用的情况,例如Animal animal=new dog();将子类对象当做父类使用时不需要任何显式声明,需要注意的是,此时不能通过父 类变量去调用子类中的某些方法,这时要用到对象类型转换。

instanceof关键字可以判断一个对象是否为某个类(或接口)的实例或者子类实例。

例:

1 public interface Animal {

2 void shout();

3 }

4 class Dog implements Animal{

5 public void shout(){

6 System.out.println("汪汪汪");

7 }

8 }

9 class Cat implements Animal {

10 public void shout() {

11 System.out.println("喵喵喵");

12 }

13

14 public static void main(String【】 args) {

15

16 Cat cat = new Cat();

17 Dog dog = new Dog();

18

19 animalShout(cat);

20 animalShout(dog);

21 // animal1.shout();

22 // animal2.shout();

23 / animalShout(animal1);

24 animalShout(animal2);

25 }

26 public static void animalShout(Animal animal){

27 animal.shout();

28 }/

29 }

30

31 public static void animalShout(Animal animal) {

32 if (animal instanceof Dog) { /instanceof关键字判断animalShout方法中传入的对象是否为Dog类型/

33 //Cat cat = (Cat) animal;

34 //animal.shout();

35 Dog dog = (Dog) animal;

36 animal.shout();

37 } else if(animal instanceof Cat){ /instanceof关键字判断animalShout方法中传入的对象是否为Cat类型/

38 Cat cat=(Cat) animal;

39 animal.shout();

40 }//代码效果参考:http://www.ezhiqi.com/zx/art_884.html

41 }

42 }

匿名内部类

匿名内部类是实现接口的一种简便写法,在程序中不一定非要使用匿名内部类。

格式:new 父类(参数列表)或父接口(){/匿名内部类实现部分*/}

1 //匿名内部类

2 public interface Jiaju {

3 public void name();

4

5 public class Test {

6 public static void main(String【】 args) {

7 zhidaoName(new Jiaju() {

8 @Override

9 public void name() {

10 System.out.println("我是凳子");

11 }

12 });

13 }

14 public static void zhidaoName(Jiaju a){

15 a.name();

16 }

17 }

18 }

相关文章
|
6月前
|
存储 C++ 容器
第十四章:C++虚函数、继承和多态详解
第十四章:C++虚函数、继承和多态详解
56 0
|
2月前
|
存储 C#
C# 一分钟浅谈:继承与多态性的实践
【9月更文挑战第2天】本文从基础入手,详细介绍了面向对象编程中继承与多态性的核心概念。通过 `Animal`、`Dog` 和 `Cat` 类的示例代码,展示了如何利用继承重用代码及多态性实现不同对象对同一方法的多样化响应,帮助读者更好地理解和应用这两个重要概念,提升面向对象编程能力。
43 3
|
5月前
|
C++
C++一分钟之-继承与多态概念
【6月更文挑战第21天】**C++的继承与多态概述:** - 继承允许类从基类复用代码,增强代码结构和重用性。 - 多态通过虚函数实现,使不同类对象能以同一类型处理。 - 关键点包括访问权限、构造/析构、菱形问题、虚函数与动态绑定。 - 示例代码展示如何创建派生类和调用虚函数。 - 注意构造函数初始化、空指针检查和避免切片问题。 - 应用这些概念能提升程序设计和维护效率。
39 2
|
6月前
|
Serverless PHP
当谈论面向对象编程时,这四个概念是非常重要的。以下是对接口、继承、封装和多态的简要说明
本文介绍了面向对象编程的四个核心概念:接口、继承、封装和多态。接口定义对象的行为规范,类通过实现接口确保符合所需行为。继承允许在已有类基础上创建新类,实现代码重用。封装是将数据和操作捆绑并隐藏内部细节,提高安全性和可维护性。多态使对象在运行时能表现出不同行为,增加代码灵活性和可扩展性。文中还提供了代码示例来说明这些概念。
40 0
|
安全 C++
c++学习之继承
c++学习之继承
78 0
|
设计模式
代码学习-多态
代码学习-多态
58 0
重写前奏~继承和多态
上次说到的重载是指同一类中方法和方法之间的关系,这次向大家介绍的重写是子不同类中方法和方法的关系;在介绍重写之前,要先说说继承和多态;
|
C++
第十三章 类继承
第十三章 类继承
105 0
|
编译器 Go C++
c++学习笔记之继承和多态
1、public 继承 class A : public B (1)友元函数不能被继承 (2)protected成员可以被派生类和友元访问
122 0
|
C++
[C++学习]继承
[C++学习]继承
89 0