0


大数据Java基础DAY11(抽象类,接口)

抽象类

抽象类概述

  1. Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

抽象类特点

a.抽象类和抽象方法必须用abstract关键字修饰

格式:

  1. abstract class 类名 {}
  2. public abstract void eat(); (抽象方法)

b.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

c.抽象类不能实例化

  1. 那么,抽象类如何实例化呢? 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。

d.抽象类的子类

  1. 要么是抽象类
  2. 要么重写抽象类中的所有抽象方法

例:

  1. abstract class Animals2{ //定义一个抽象的动物类
  2. public abstract void eat(); //定义一个抽象的方法
  3. public abstract void character(); //定义父类的第二个抽象方法
  4. }
  5. class Sheep2 extends Animals2{
  6. @Override
  7. public void eat(){
  8. System.out.println("羊吃草"); //重写父类中的抽象方法
  9. }
  10. @Override
  11. public void character() {
  12. System.out.println("羊很温顺");
  13. }
  14. }
  15. class Wolf2 extends Animals2{
  16. @Override
  17. public void eat(){
  18. System.out.println("狼吃肉"); //重写父类中的抽象方法
  19. }
  20. @Override
  21. public void character() {
  22. System.out.println("狼很残暴");
  23. }
  24. }
  25. public class Test4 {
  26. public static void main(String[] args) {
  27. //多态创建对象
  28. Animals2 s=new Sheep2();
  29. s.eat();
  30. s.character();
  31. Animals2 w =new Wolf2();
  32. w.eat();
  33. w.character();
  34. }
  35. }

抽象类的成员特点

a.成员变量

  1. 可以是变量
  2. 也可以是常量

b.构造方法

  1. 有构造方法,但是不能实例化
  2. 那么,构造方法的作用是什么呢? 用于子类访问父类数据的初始化

c.成员方法

  1. 可以有抽象方法 限定子类必须完成某些动作
  2. 也可以有非抽象方法 提高代码服用性

案例:假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。 经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。 请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。

  1. abstract class Staff{
  2. //定义员工的成员变量
  3. private String name;
  4. private String number;
  5. private int wage;
  6. public Staff() {
  7. } //无参构造方法
  8. public Staff(String name, String number, int wage) { //有参构造方法
  9. this.name = name;
  10. this.number = number;
  11. this.wage = wage;
  12. }
  13. //get方法
  14. public String getName() {
  15. return name;
  16. }
  17. public String getNumber() {
  18. return number;
  19. }
  20. public int getWage() {
  21. return wage;
  22. }
  23. public abstract void work(); //定义父类抽象方法
  24. public void show(){
  25. System.out.println("姓名:"+name);
  26. System.out.println("工号:"+number);
  27. System.out.println("工资:"+wage);
  28. }
  29. }
  30. class Manager extends Staff{ //经理类
  31. private int bonus; //经理特有的奖金属性
  32. public Manager(String name, String number, int wage, int bonus) { //子类有参构造方法
  33. super(name, number, wage);
  34. this.bonus = bonus;
  35. }
  36. @Override
  37. public void work() {
  38. System.out.println("工作:管理员工"); //重写抽象类方法
  39. }
  40. public void show2(){
  41. System.out.println("奖金:"+bonus);
  42. }
  43. }
  44. class GeneralStaff extends Staff{ //普通员工类
  45. public GeneralStaff(String name, String number, int wage) {
  46. super(name, number, wage);
  47. }
  48. @Override
  49. public void work() {
  50. System.out.println("工作:写程序");
  51. }
  52. }
  53. public class Test5 {
  54. public static void main(String[] args) {
  55. //多态创建经理对象
  56. Staff s1 =new Manager("经理","00001",100000,20000);
  57. s1.show();
  58. s1.work();
  59. //向下转型,访问子类特有方法
  60. Manager manager= (Manager) s1;
  61. manager.show2();
  62. System.out.println("================================");
  63. //多态创建普通员工对象
  64. Staff s2 =new GeneralStaff("普通员工","00002",20000);
  65. s2.show();
  66. s2.work();
  67. }
  68. }

抽象类中的问题

a.一个类没有抽象方法能不能定义为抽象类?如果有,有何意义?

  1. 可以,例如水和饮料都有共同的特点,我们把这些相同的概念归结成一个类,都是液体。至于后面有没有抽象方法,取决于他们有没有共同的功能,如果只是有相同的本质,没有实际相同的行为,我们只定义抽象类不写抽象方法是可以的。

b.abstract不能和哪些关键字共存

  1. private 冲突
  2. final 冲突
  3. static 无意义

接口

接口特点

a.接口用关键字interface表示

  1. 格式:interface 接口名 {}

b.类实现接口用implements表示

  1. 格式:class 类名 implements 接口名 {}

c.接口不能实例化

  1. 那么,接口如何实例化呢? 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态。

d.接口的子类

  1. 要么是抽象类
  2. 要么重写接口中的所有抽象方法

例:

  1. abstract class OldPhone{ //定义一个抽象的父类
  2. public abstract void call();
  3. }
  4. interface Phone{ //定义一个接口Phone
  5. public void play();
  6. }
  7. class NewPhone extends OldPhone implements Phone{ //定义一个OldPhone类继承NewPhone类并实现接口
  8. @Override
  9. public void call() {
  10. System.out.println("打电话"); //重写父类中的抽象方法
  11. }
  12. @Override
  13. public void play() {
  14. System.out.println("玩游戏"); //重写接口里面的方法
  15. }
  16. public void watch(){
  17. System.out.println("看视频"); //子类特有方法
  18. }
  19. }
  20. public class interfaceTest1 {
  21. public static void main(String[] args) {
  22. //多态创建NewPhone的对象
  23. OldPhone a= new NewPhone();
  24. a.call();
  25. //OldPhone里没有play和watch的方法。向下转型
  26. NewPhone b =(NewPhone) a;
  27. b.play();
  28. b.watch();
  29. }
  30. }

接口成员特点

a.成员变量

  1. 只能是常量 默认修饰符 public static final

例:

  1. interface A{
  2. int s= 100;
  3. }
  4. class B implements A{
  5. }
  6. public class interfaceTest2 {
  7. public static void main(String[] args) {
  8. A a= new B();
  9. a.s=1000;
  10. }
  11. }

我们通过Java反编译工具可以看到这里隐藏的修饰

b.构造方法

  1. 没有,因为接口主要是扩展功能的,而没有具体存在

(虽然接口中没有构造方法,但多态初始化的时候会先初始化父类在初始化子类,java中所有的类都有一个父类叫Object,每个class都有Object作为父类)

c.成员方法

  1. 只能是抽象方法 默认修饰符 public abstract

例:同样 我们可以在接口例添加一个方法,通过反编译工具看到隐藏的修饰

类与类,类与接口以及接口与接口的关系

a.类与类

  1. 继承关系,只能单继承,但是可以多层继承
  1. class A1{}
  2. class B1 extends A1{}
  3. class C1 extends B1{}

b.类与接口

  1. 实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
  1. interface Inter1{}
  2. interface Inter2{}
  3. class C extends Object implements Inter1,Inter2{}

c.接口与接口

  1. 继承关系,可以单继承,也可以多继承
  1. interface Inter1{}
  2. interface Inter2{}
  3. interface Inter3 extends Inter1,Inter2{}

抽象类和接口的区别

  1. 成员区别

    1. a.抽象类 : 变量,常量;有抽象方法;抽象方法,非抽象方法
    2. b.接口: 常量;抽象方法

2.关系区别

  1. a.类与类 :继承,单继承
  2. b.类与接口: 实现,单实现,多实现
  3. c.接口与接口 :继承,单继承,多继承

3.设计理念区别

  1. a.抽象类 被继承体现的是:”is a”的关系。共性功能
  2. b.接口 被实现体现的是:”like a”的关系。扩展功能

教练和运动员案例:

  1. a.乒乓球运动员和篮球运动员;乒乓球教练和篮球教练。
  2. b.为了出国交流,跟乒乓球相关的人员都需要学习英语。
  3. c.请用所学知识: 分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。
  1. abstract class Person{ //定义一个抽象的人类
  2. private String name;
  3. private int age; //定义成员变量
  4. public Person() {} //无参构造方法
  5. public Person(String name, int age) { //有参构造方法 (快捷键alt+insert)
  6. this.name = name;
  7. this.age = age;
  8. }
  9. //set和get方法
  10. public String getName() {
  11. return name;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. public void show(){ //定义一个展示的方法
  23. System.out.println("姓名:"+name+",年龄:"+age);
  24. }
  25. }
  26. class SportsMan extends Person{ //创建运动员类继承人类
  27. //无参,有参构造方法
  28. public SportsMan() {}
  29. public SportsMan(String name, int age) {
  30. super(name, age);
  31. }
  32. }
  33. class Coach extends Person{ //创建教练类继承人类
  34. //有参,无参构造方法
  35. public Coach() {}
  36. public Coach(String name, int age) {
  37. super(name, age);
  38. }
  39. }
  40. interface English{ //创建一个English接口
  41. public abstract void study(); //这里即使写不写abstract都一样,默认abstract修饰,初学者可以写一下。
  42. }
  43. class PingPongSports extends SportsMan implements English{ //创建乒乓球运动员类继承SportsMan类并实现English接口
  44. public PingPongSports(String name, int age) {
  45. super(name, age);
  46. }
  47. @Override //重写接口中的抽象方法(快捷键 alt+Enter)
  48. public void study() {
  49. System.out.println("乒乓球运动员学习英语");
  50. }
  51. }
  52. class BasketballSports extends SportsMan{ //创建篮球运动员继承SportsMan类
  53. public BasketballSports(String name, int age) {
  54. super(name, age);
  55. }
  56. }
  57. class PingPongCoach extends Coach implements English{ //创建乒乓球教练类继承SportsMan类并实现English接口
  58. public PingPongCoach(String name, int age) {
  59. super(name, age);
  60. }
  61. @Override //重写接口中的抽象方法
  62. public void study() {
  63. System.out.println("乒乓球教练学习英语");
  64. }
  65. }
  66. class BasketballCoach extends Coach{ //创建篮球教练继承教练类
  67. public BasketballCoach(String name, int age) {
  68. super(name, age);
  69. }
  70. }
  71. public class interfaceTest3 {
  72. public static void main(String[] args) {
  73. //创建一个乒乓球运动员对象
  74. SportsMan s1 = new PingPongSports("乒乓球运动员",18);
  75. s1.show();
  76. //向下转型,访问子类特有方法
  77. PingPongSports p =(PingPongSports) s1;
  78. p.study(); // ((PingPongSports) s1).study() ,把这两个合成一个都行
  79. System.out.println("=================");
  80. //创建一个篮球教练的对象
  81. Coach s2 =new BasketballCoach("篮球教练",40);
  82. s2.show();
  83. }
  84. }


本文转载自: https://blog.csdn.net/qq_52400447/article/details/122627549
版权归原作者 16年义务教育 所有, 如有侵权,请联系我们删除。

“大数据Java基础DAY11(抽象类,接口)”的评论:

还没有评论