多态与接口重点摘要

接口特点:
  1. 接口用interface修饰

    interface 接口名{}

  2. 类实现接口用implements表示

    class 类名 implements接口名{}

  3. 接口不能实例化,可以创建接口实现类

  4. 接口的子类

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

    2. 要么子类也是一个抽象类

类和接口关系:
  1. 类与类关系

    继承关系,只能单继承,可以多层继承

  2. 类与接口的关系

    实现关系,可以单实现,也可以多实现,还可以继承一个类的同时实现多个接口

  3. 接口与接口关系

    继承关系,可以单继承,可以多继承

接口默认方法:

格式:

default 返回值类型 方法名 (参数列表){}

作用:

解决接口升级问题,不用重写所有方法

注意事项:

  1. 默认方法不是抽象方法,不要求强制重写.但是可以被重写,重写时候去掉default关键字

  2. public可以省略 default不可以省略

  3. 如果实现多接口,接口之间有相同方法声明的方法,那么子类必须重写该默认方法

接口中静态方法:

格式:

static 返回值类型 方法名(参数列表){}

注意:

  1. 静态方法只能通过接口名调用,不能通过实现类或者对象名调用

  2. public可以省略 static省略,不能跟default同时出现

接口中私有的方法:

格式:

  1. private 返回值类型 方法名(参数列表){}

  2. private static 返回值类型 方法名(参数列表){}

注意:

  1. 默认方法可以调用私有的静态方法和非静态方法

  2. 静态方法只能调用是有的静态方法

多态前提:
  1. 要有(继承/实现)关系

  2. 要有方法重写

  3. 要有父类引用指向子类对象

多态访问特点:
  1. 成员变量:编译看左(父类),运行看左(父类)

  2. 成员方法:编译看左(父类),运行看右(子类)注:因为子类对方法进行了重写,所以运行时候看重写后的方法

多态的好处与弊端:

好处:

  1. 提高了程序的扩展性

  2. 具体表现为定义方法的时候,使用父类型作为参数,该方法就可以接收者父类的任意子类对象

弊端:

  • 不能调用子类特有的功能

多态的转型:

  1. 向上转型:父类引用指向子类对象就是向上转型

  2. 向下转型:子类型 对象名=(子类型)父类引用

转型风险:

风险:

如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么转换时

候就会异常

解决方案:

方案一:

变量名 instanceof 类型配合if语句

例:if(变量名 instanceof 父类类型){

子类型 对象名=(子类型)父类引用

对象名.子类特有方法名

}

方案二:

直接创建子类对象调用子类方法简单粗暴

              课堂笔记-抽象类-final-接口

抽象类

抽象方法

当我们在父类中编写了一个所有子类都一定会有,但是每个子类具体的方法内容又不一样的方法,这个方法就可以写成抽象方法;

思考: 为什么一定要在父类中写所有子类都有,但是内容又不一样的方法呢?

答: 是因为父类一旦编写了这样的方法,所有的子类都必须强制性重写;

抽象类

包含了抽象方法的类一定是抽象类;

是不是抽象类就一定会包含抽象方法呢?

答: 不一定;

如何编写抽象方法和抽象类

//抽象类
public  abstract class 类名{
   //抽象方法   子类一定会重写该方法
   public  abstract  返回值类型   方法名(形参);
}

抽象类的注意事项

final关键字

概述

final表示最终的含义,可以修饰类,方法,变量;

修饰类

public  final class 类名{
   
}
这样的类不能被其他类继承;

修饰方法

public final 返回值类型  方法名(参数列表){
   
}
这样的方法子类不能重写;

修饰变量

final 基本数据类型  变量名 = 数据值; // 这样的变量,数据值不能改变
final 引用数据类型  变量名 = 数据值; // 这样的变量,地址值不能改变,但是对象中的内容可以改变

代码块

详解接口

概述

定义接口,实际上就是定义了一套规则/(规范),定义了规则之后,就要求子类必须按照接口制定的规则编写代码;

语法格式

public  interface  接口名{
   接口的成员;
}

接口成员的特点(JDK7以前)

在JDK8中,对接口新增了默认方法

目的是为了在接口中添加一些带有方法体的方法,同时有不让子类报错;
默认方法的语法:
public default  返回值类型  方法名(形参){
   方法体;
}
使用:
实现类可以重写也可以不重写,通过实现类的对象调用默认方法;
当实现类实现的多个接口中出现了重名的默认方法时,实现类必须重写;

静态方法的语法:
public static  返回值类型  方法名(形参){
   方法体;
}
使用:
只能使用接口名.方法名(实参);的形式调用;

在JDK9中,对接口新增了私有方法

私有方法可以是静态的也可以是非静态的,主要是为jdk8增加的默认方法和静态方法服务的;

接口的注意事项

  1. 接口不能直接创建对象;(只能创建接口的实现类/子类对象)

  2. 接口中没有构造方法;

  3. 接口与类之间,只能是类实现接口;实现的关键字是 implements

  4. 接口与接口之间,可以多继承,使用的关键字是 extends

多态

多态的概述

一个对象,多种形态;

多态的前提

有继承或有实现

多态的代码形式(重点)

父类类型 变量名 = new 子类类名();

多态中成员访问的特点

成员变量(了解)

编译和运行都看父类类型;

成员方法(重点)

编译看左边(父类),运行看右边;(子类)

多态的好处和弊端

多态的转型

向上转型: 子类对象,转成父类类型, Fu f = new Zi();

向下转型: 父类对象,转成子类类型, Zi z = (Zi)f;

多态的类型转换异常

为了解决类型转换异常,在转换之前,应该先判断被转的对象是否与目标类型一致;

判断的格式:

if(对象名 instanceof 类名){
   在这里转
}

                   代码练习:

1.接口

1.1黑马信息管理系统集合改进 (应用)

  • 使用数组容器的弊端

    1. 容器长度是固定的,不能根据添加功能自动增长

    2. 没有提供用于赠删改查的方法

  • 优化步骤

    1. 创建新的StudentDao类,OtherStudentDao

    2. 创建ArrayList集合容器对象

    3. OtherStudentDao中的方法声明,需要跟StudentDao保持一致

      注意:如果不一致,StudentService中的代码就需要进行修改

    4. 完善方法(添加、删除、修改、查看)

    5. 替换StudentService中的Dao对象

  • 代码实现

    OtherStudentDao类

    public class OtherStudentDao {
       // 集合容器
       private static ArrayList<Student> stus = new ArrayList<>();

       static {
           Student stu1 = new Student("heima001","张三","23","1999-11-11");
           Student stu2 = new Student("heima002","李四","24","2000-11-11");

           stus.add(stu1);
           stus.add(stu2);
      }

       // 添加学生方法
       public boolean addStudent(Student stu) {
          stus.add(stu);
          return true;
      }

       // 查看学生方法
       public Student[] findAllStudent() {

           Student[] students = new Student[stus.size()];

           for (int i = 0; i < students.length; i++) {
               students[i] = stus.get(i);
          }

           return students;
      }

       public void deleteStudentById(String delId) {
           // 1. 查找id在容器中所在的索引位置
           int index = getIndex(delId);
           stus.remove(index);
      }

       public int getIndex(String id){
           int index = -1;
           for (int i = 0; i < stus.size(); i++) {
               Student stu = stus.get(i);
               if(stu != null && stu.getId().equals(id)){
                   index = i;
                   break;
              }
          }
           return index;
      }

       public void updateStudent(String updateId, Student newStu) {
           // 1. 查找updateId, 在容器中的索引位置
           int index = getIndex(updateId);
           stus.set(index, newStu);
      }
    }

    StudentService类

    public class StudentService {
       // 创建StudentDao (库管)
        private OtherStudentDao studentDao = new OtherStudentDao();
    // 其他方法没有变化,此处省略...
    }    

1.2黑马信息管理系统抽取Dao (应用)

  • 优化步骤

    1. 将方法向上抽取,抽取出一个父类 ( BaseStudentDao )

    2. 方法的功能实现在父类中无法给出具体明确,定义为抽象方法

    3. 让两个类分别继承 BaseStudentDao ,重写内部抽象方法

  • 代码实现

    BaseStudentDao类

    public abstract class BaseStudentDao {
       // 添加学生方法
       public abstract boolean addStudent(Student stu);
       // 查看学生方法
       public abstract Student[] findAllStudent();
       // 删除学生方法
       public abstract void deleteStudentById(String delId);
       // 根据id找索引方法
       public abstract int getIndex(String id);
       // 修改学生方法
       public abstract void updateStudent(String updateId, Student newStu);
    }

    StudentDao类

    public class StudentDao extends BaseStudentDao {
     // 其他内容不变,此处省略
    }

    OtherStudentDao类

    public class OtherStudentDao extends BaseStudentDao {
     // 其他内容不变,此处省略
    }

1.3接口的概述(理解)

  • 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。

  • Java中接口存在的两个意义

    1. 用来定义规范

    2. 用来做功能的拓展

1.4接口的特点(记忆)

  • 接口用关键字interface修饰

    public interface 接口名 {} 
  • 类实现接口用implements表示

    public class 类名 implements 接口名 {}
  • 接口不能实例化

    我们可以创建接口的实现类对象使用

  • 接口的子类

    要么重写接口中的所有抽象方法

    要么子类也是抽象类

1.5接口的成员特点(记忆)

  • 成员特点

    • 成员变量

      只能是常量 ​ 默认修饰符:public static final

    • 构造方法

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

    • 成员方法

      只能是抽象方法

      默认修饰符:public abstract

      关于接口中的方法,JDK8和JDK9中有一些新特性,后面再讲解

  • 代码演示

    • 接口

    public interface Inter {
       public static final int NUM = 10;

       public abstract void show();
    }
    • 实现类

    class InterImpl implements Inter{

       public void method(){
           // NUM = 20;
           System.out.println(NUM);
      }

       public void show(){

      }
    }
    • 测试类

    public class TestInterface {
       /*
           成员变量: 只能是常量 系统会默认加入三个关键字
                       public static final
           构造方法: 没有
           成员方法: 只能是抽象方法, 系统会默认加入两个关键字
                       public abstract
        */
       public static void main(String[] args) {
           System.out.println(Inter.NUM);
      }
     
    }

1.6类和接口的关系(记忆)

  • 类与类的关系

    继承关系,只能单继承,但是可以多层继承

  • 类与接口的关系

    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

  • 接口与接口的关系

    继承关系,可以单继承,也可以多继承

1.7黑马信息管理系统使用接口改进 (应用)

  • 实现步骤

    1. 将 BaseStudentDao 改进为一个接口

    2. 让 StudentDao 和 OtherStudentDao 去实现这个接口

  • 代码实现

    BaseStudentDao接口

    public interface BaseStudentDao {
       // 添加学生方法
       public abstract boolean addStudent(Student stu);
       // 查看学生方法
       public abstract Student[] findAllStudent();
       // 删除学生方法
       public abstract void deleteStudentById(String delId);
       // 根据id找索引方法
       public abstract int getIndex(String id);
       // 修改学生方法
       public abstract void updateStudent(String updateId, Student newStu);
    }

    StudentDao类

    public class StudentDao implements BaseStudentDao {
     // 其他内容不变,此处省略
    }

    OtherStudentDao类

    public class OtherStudentDao implements BaseStudentDao {
     // 其他内容不变,此处省略
    }

1.8黑马信息管理系统解耦合改进 (应用)

  • 实现步骤

    1. 创建factory包,创建 StudentDaoFactory(工厂类)

    2. 提供 static 修改的 getStudentDao 方法,该方法用于创建StudentDao对象并返回

  • 代码实现

    StudentDaoFactory类

    public class StudentDaoFactory {
       public static OtherStudentDao getStudentDao(){
           return new OtherStudentDao();
      }
    }

    StudentService类

    public class StudentService {
       // 创建StudentDao (库管)
       // private OtherStudentDao studentDao = new OtherStudentDao();

       // 通过学生库管工厂类, 获取库管对象
       private OtherStudentDao studentDao = StudentDaoFactory.getStudentDao();
    }  

2.接口组成更新

2.1接口组成更新概述【理解】

  • 常量

    public static final

  • 抽象方法

    public abstract

  • 默认方法(Java 8)

  • 静态方法(Java 8)

  • 私有方法(Java 9)

2.2接口中默认方法【应用】

  • 格式

    public default 返回值类型 方法名(参数列表) { }

  • 作用

    解决接口升级的问题

  • 范例

    public default void show3() { 
    }
  • 注意事项

    • 默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字

    • public可以省略,default不能省略

    • 如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写

2.3接口中静态方法【应用】

  • 格式

    public static 返回值类型 方法名(参数列表) { }

  • 范例

    public static void show() {
    }
  • 注意事项

    • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

    • public可以省略,static不能省略

2.4接口中私有方法【应用】

  • 私有方法产生原因

    Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性

  • 定义格式

    • 格式1

      private 返回值类型 方法名(参数列表) { }

    • 范例1

      private void show() {
      }
    • 格式2

      private static 返回值类型 方法名(参数列表) { }

    • 范例2

      private static void method() {
      }
  • 注意事项

    • 默认方法可以调用私有的静态方法和非静态方法

    • 静态方法只能调用私有的静态方法

3.多态

3.1多态的概述(记忆)

  • 什么是多态

    同一个对象,在不同时刻表现出来的不同形态

  • 多态的前提

    • 要有继承或实现关系

    • 要有方法的重写

    • 要有父类引用指向子类对象

  • 代码演示

    class Animal {
    public void eat(){
    System.out.println("动物吃饭");
    }
    } class Cat extends Animal {
    @Override
    public void eat() {
    System.out.println("猫吃鱼");
    }
    } public class Test1Polymorphic {
    /*
    多态的前提: 1. 要有(继承 \ 实现)关系
    2. 要有方法重写
    3. 要有父类引用, 指向子类对象
    */
    public static void main(String[] args) {
    // 当前事物, 是一只猫
    Cat c = new Cat();
    // 当前事物, 是一只动物
    Animal a = new Cat();
    a.eat(); }
    }

3.2多态中的成员访问特点(记忆)

  • 成员访问特点

    • 成员变量

      编译看父类,运行看父类

    • 成员方法

      编译看父类,运行看子类

  • 代码演示

    class Fu {
    int num = 10; public void method(){
    System.out.println("Fu.. method");
    }
    } class Zi extends Fu {
    int num = 20; public void method(){
    System.out.println("Zi.. method");
    }
    } public class Test2Polymorpic {
    /*
    多态的成员访问特点: 成员变量: 编译看左边 (父类), 运行看左边 (父类) 成员方法: 编译看左边 (父类), 运行看右边 (子类)
    */
    public static void main(String[] args) {
    Fu f = new Zi();
    System.out.println(f.num);
    f.method();
    }
    }

3.3多态的好处和弊端(记忆)

  • 好处

    提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作

  • 弊端

    不能使用子类的特有成员

3.4多态中的转型(应用)

  • 向上转型

    父类引用指向子类对象就是向上转型

  • 向下转型

    格式:子类型 对象名 = (子类型)父类引用;

  • 代码演示

    class Fu {
    public void show(){
    System.out.println("Fu..show...");
    }
    } class Zi extends Fu {
    @Override
    public void show() {
    System.out.println("Zi..show...");
    } public void method(){
    System.out.println("我是子类特有的方法, method");
    }
    } public class Test3Polymorpic {
    public static void main(String[] args) {
    // 1. 向上转型 : 父类引用指向子类对象
    Fu f = new Zi();
    f.show();
    // 多态的弊端: 不能调用子类特有的成员
    // f.method(); // A: 直接创建子类对象
    // B: 向下转型 // 2. 向下转型 : 从父类类型, 转换回子类类型
    Zi z = (Zi) f;
    z.method();
    }
    }

3.5多态中转型存在的风险和解决方案 (应用)

  • 风险

    如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException

  • 解决方案

    • 关键字

      instanceof

    • 使用格式

      变量名 instanceof 类型

      通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果

  • 代码演示

    abstract class Animal {
    public abstract void eat();
    } class Dog extends Animal {
    public void eat() {
    System.out.println("狗吃肉");
    } public void watchHome(){
    System.out.println("看家");
    }
    } class Cat extends Animal {
    public void eat() {
    System.out.println("猫吃鱼");
    }
    } public class Test4Polymorpic {
    public static void main(String[] args) {
    useAnimal(new Dog());
    useAnimal(new Cat());
    } public static void useAnimal(Animal a){ // Animal a = new Dog();
    // Animal a = new Cat();
    a.eat();
    //a.watchHome(); // Dog dog = (Dog) a;
    // dog.watchHome(); // ClassCastException 类型转换异常 // 判断a变量记录的类型, 是否是Dog
    if(a instanceof Dog){
    Dog dog = (Dog) a;
    dog.watchHome();
    }
    } }

3.6黑马信息管理系统多态改进 (应用)

  • 实现步骤

    1. StudentDaoFactory类中方法的返回值定义成父类类型BaseStudentDao

    2. StudentService中接收方法返回值的类型定义成父类类型BaseStudentDao

  • 代码实现

    StudentDaoFactory类

    public class StudentDaoFactory {
    public static BaseStudentDao getStudentDao(){
    return new OtherStudentDao();
    }
    }

    StudentService类

    public class StudentService {
    // 创建StudentDao (库管)
    // private OtherStudentDao studentDao = new OtherStudentDao(); // 通过学生库管工厂类, 获取库管对象
    private BaseStudentDao studentDao = StudentDaoFactory.getStudentDao();
    }

               java进阶课后作业

问答题【继承】

1.1 请问子类继承父类用什么关键字?

extends

1.2 请问子类继承父类的好处是什么?

1:可以提升代码的复用性;
2:子类对象可以直接使用父类非私有的属性和方法;

1.3 请问父类的哪些成员不能被子类继承,或者不能被直接访问?

私有成员

1.4 请问子类是否可以同时继承多个父类?

不可以,可以多层继承

问答题【抽象类】

4.1 请问定义抽象类、抽象方法使用的关键字是什么?

abstract

4.2 请问定义抽象类有什么作用?

1:可以作为设计模式使用;(例如:模板模式)
2:可以通过抽象类的抽象方法强制子类重写某些方法
 

4.3 请问定义抽象方法有什么作用?

父类中方法无法进行具体事务描述时候,强制子类重写方法

4.4 请问一个类继承了抽象类后,必须要做的事情是什么?

重写抽象类的抽象方法,或者子类是抽象类

4.5 请问抽象类是否可以继承其它抽象类?

可以继承

问答题【接口】

2.1 请问子类实现接口使用什么关键字?

impl//implements

2.2 请问子类实现接口后有什么要求?

重写接口中所有的抽象方法,要么子类也是抽象类

2.3 请问子类是否可以同时实现多个接口?

可以,但是此时子类必须重写所有接口的抽象方法,否则该类只能也是抽象类

2.4 请问子类是否可以在继承一个类的同时实现多个接口?可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

可以

2.5 请问接口是否可以继承一个或多个接口?

接口与接口继承关系,可以单继承,也可以多继承

问答题【final】

请写出final可以修饰的元素,并写出修饰后的含义。

final修饰类:
该类不能被继承(不可以有子类,但是可以有父类)
final修饰方法:
该方法不可以被重写
final修饰变量:
表明该变量是一个产量,不能再次被赋值
       1.变量是基本类型,不能改变的是值
       2.变量是引用数据类型,不能改变的是地址值,但地址值中的内容可以改变

编程题【抽象类】

题目1:

我们计划为一所体育学校设计一套系统,需要记录以下人员的信息:

教练员:

属性:员工编号、姓名、性别、年龄

行为:吃饭(吃工作餐)

运动员:

属性:学员编号、姓名、性别、年龄、所在班级

行为:吃饭(吃营养餐)

参考答案:

package day3.No_1;

public class Demo {
   public static void main(String[] args) {
       Jiaolian j=new Jiaolian("020300","教1","男",23);
       j.show();
       j.eat();
       Student s=new Student("0300","学1","男",21,"软件1班");
       s.show();
       s.eat();

  }
}
//Fu
abstract class Ren{
   private String id;
   private String name;
   private String xingbie;
   private int age;

   public Ren() {
  }

   public Ren(String id, String name, String xingbie, int age) {
       this.id = id;
       this.name = name;
       this.xingbie = xingbie;
       this.age = age;
  }

   public String getId() {
       return id;
  }

   public void setId(String id) {
       this.id = id;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public String getXingbie() {
       return xingbie;
  }

   public void setXingbie(String xingbie) {
       this.xingbie = xingbie;
  }

   public int getAge() {
       return age;
  }

   public void setAge(int age) {
       this.age = age;
  }

   public abstract void eat();
}
//Zi
class Jiaolian extends Ren{

   public Jiaolian() {
  }

   public Jiaolian(String id, String name, String xingbie, int age) {
       super(id, name, xingbie, age);
  }

   @Override
   public void eat() {
       System.out.println("吃工作餐");
  }
   public void show(){
       System.out.println(getId()+"\t"+getName()+"\t"+getXingbie()+"\t"+getAge());
  }
}
//Zi
class Student extends Ren{
   private String banji;

   public String getBanji() {
       return banji;
  }

   public void setBanji(String banji) {
       this.banji = banji;
  }

   public Student(String id, String name, String xingbie, int age, String banji) {
       super(id, name, xingbie, age);
       this.banji = banji;
  }

   @Override
   public void eat() {
       System.out.println("吃营养餐");
  }
   public void show(){
       System.out.println(getId()+"\t"+getName()+"\t"+getXingbie()+"\t"+getAge()+"\t"+getBanji());
  }
}

编程题【接口】

题目1

1.请定义“员工(类)”: 属性:姓名、性别、年龄(全部私有) 行为:工作(抽象) 无参、全参构造方法 get/set方法 2.请定义“绘画(接口)” 抽象方法:绘画 3.请定义“Java讲师类”继承自“员工类” 4.请定义”UI讲师类”,继承自“员工类”,并实现“绘画”接口。

3.2 要求 请按上述要求设计出类结构,并实现相关的方法,并进行调用测试。 3.编程题【接口】

接口类:

package day3.No_3;

public interface Inter {
   public void huihua();
}

实现类测试类:

package day3.No_3;

public abstract class Ren {
   private String name;
   private String xingbie;
   private  int age;
   public abstract void gongzuo();

   public Ren() {
  }

   public Ren(String name, String xingbie, int age) {
       this.name = name;
       this.xingbie = xingbie;
       this.age = age;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public String getXingbie() {
       return xingbie;
  }

   public void setXingbie(String xingbie) {
       this.xingbie = xingbie;
  }

   public int getAge() {
       return age;
  }

   public void setAge(int age) {
       this.age = age;
  }
}
//Java讲师
class Java extends Ren{
   public Java() {
  }

   public Java(String name, String xingbie, int age) {
       super(name, xingbie, age);
  }

   @Override
   public void gongzuo() {
       System.out.println("Java讲师");
  }
   public void  show(){
       System.out.println(getName()+"\t"+getXingbie()+"\t"+getAge()+"\t");
       gongzuo();
  }
}
//Ui讲师
class Ui extends Ren implements Inter{
   public Ui() {
  }

   public Ui(String name, String xingbie, int age) {
       super(name, xingbie, age);
  }

   @Override
   public void gongzuo() {
       System.out.println("Ui讲师");
  }

   @Override
   public void huihua() {
       System.out.println("绘画");
  }
   public void  show(){
       System.out.println(getName()+"\t"+getXingbie()+"\t"+getAge()+"\t");
       gongzuo();
       huihua();
  }
}
//测试类
class Test{
   public static void main(String[] args) {
       Java j=new Java("张三","男",23);
       j.show();
       Ui u=new Ui("李四","男",24);
       u.show();

  }
}
运行效果:

题目2

一个机动车管理系统中有以下类的设计: ​ 机动车类: ​ |--汽车类: ​ |--奔驰车 ​ |--宝马车 ​ |--摩托车类: ​ |--雅马哈摩托 ​ |--宝马摩托 ​ 所有的车都有如下信息: 属性:品牌、价格 行为:运行 现在要求为所有“宝马车系”的汽车增加一个GPS功能。 4.2 要求 ​ 请设计出上述的类结构,并用代码实现。

接口类:
package day3.No_4;

public interface InterGps {
   public default void Gps(){
       System.out.println("GPS");
  }
}
测试类继承类:
package day3.No_4;
//测试类
public class Demo {
   public static void main(String[] args) {
       Baoma b=new Baoma();
       b.Gps();
       System.out.println("--------");
       System.out.println();
       Baomamotuo bm=new Baomamotuo();
       b.Gps();
  }
}

//机动车类
class Jdc{
   public Jdc() {
       System.out.println("机动车");
  }
}
//汽车类
class Qc extends Jdc{
   public Qc() {
       System.out.println("汽车");
  }
}
//奔驰
class Benchi extends Qc{
   public Benchi() {
       System.out.println("奔驰");
  }
}
//宝马
class Baoma extends Qc implements InterGps{
   public Baoma() {
       System.out.println("宝马");
  }

}
//摩托车
class Motuo extends Jdc{
   public Motuo() {
       System.out.println("摩托车");
  }
}
//雅马哈
class Yamaha extends Motuo{
   public Yamaha() {
       System.out.println("雅马哈");
  }
}
//宝马摩托
class Baomamotuo extends Motuo implements InterGps{
   public Baomamotuo() {
       System.out.println("宝马摩托");
  }
}

​运行效果:

编程题1-多态的好处

请模拟生活中"养殖场老板指挥员工饲养动物"的场景;员工类中包含饲养动物的方法,而老板类(就是测试类)可以面向员工对象调用员工类的方法;代码关系示意图如下:

代码实现:

package day3.No_5;

import javax.sound.midi.Soundbank;

//老板类
public class Demo {
public static void main(String[] args) {
Yuangong y = new Yuangong();
y.Wei(new Dog());
y.Wei(new Cat());
y.Wei(new Pig());
}

}

//动物类
abstract class Dongwu {
public abstract void eat();
}

//狗类
class Dog extends Dongwu {

@Override
public void eat() {
System.out.println("狗吃肉");
}
}

//猫类
class Cat extends Dongwu {

@Override
public void eat() {
System.out.println("猫吃鱼");
}
}

//猪类
class Pig extends Dongwu {

@Override
public void eat() {
System.out.println("猪饿着减肥");
}
}
//饲养员
class Yuangong {
public void Wei(Dongwu d) {
d.eat();
}
}

运行效果:

Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案的更多相关文章

  1. Java基础进阶:继承重点摘要,继承详解,方法重写注意事项,方法重载与重写的区别,抽象类,代码块, 附重难点,代码实现源码,课堂笔记,课后扩展及答案

    继承重点摘要 *继承的特点: 子类在初始化之前,一定要先完成父类数据的初始化 子类在初始化之前,一定要先访问父类构造,完成父类数据的初始化 系统在每一个构造方法中默认隐藏了一句super(); 如果我 ...

  2. Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...

  3. Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    要点摘要 Math: 类中么有构造方法,内部方法是静态的,可以直接类名.方式调用 常用: Math.abs(int a):返回参数绝对值 Math.ceil(double a):返回大于或等于参数的最 ...

  4. Java基础进阶:学生管理系统数组方式分包源码实现,教师管理系统集合和数组两种方式源码实现,图书馆管理系统源码实现,现附重难点,代码实现源码,课堂笔记,课后扩展及答案

    1.案例驱动模式 1.1案例驱动模式概述 (理解) 通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题 1.2案例驱动模式的好处 (理解) 解决重复代码 ...

  5. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

  6. Java基础进阶

    Java基础进阶J Object类 hashcode() toString() clone() getClass() notify() wait() equals() Random类 生成 随机数 U ...

  7. Java基础系列2:深入理解String类

    Java基础系列2:深入理解String类 String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String.主要包括如下的五个内容: Strin ...

  8. 如何实现全屏遮罩(附Vue.extend和el-message源码学习)

    [Vue]如何实现全屏遮罩(附Vue.extend和el-message源码学习) 在做个人项目的时候需要做一个类似于电子相册浏览的控件,实现过程中首先要实现全局遮罩,结合自己的思路并阅读了(饿了么) ...

  9. 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案

    国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...

随机推荐

  1. maven打包时报No compiler is provided in this environment处理

    系统:macOS 开发工具:Idea 问题描述:在idea中执行mvn clean install时报No compiler is provided in this environment. Perh ...

  2. asp.net core 集成 Prometheus

    asp.net core 集成 prometheus Intro Prometheus 是一个开源的现代化,云原生的系统监控框架,并且可以轻松的集成 PushGateway, AlertManager ...

  3. BootstrapBlazor 组件库介绍

    项目介绍 演示系统地址:https://www.blazor.zone Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建丰富 ...

  4. 20200322_【转载】关于C#中使用SQLite自适应Any CPU程序的说明

    本文转载, 原文链接: http://luyutao.com/2016/09/14/csharp-sqlite-any-cpu.html 在C#中如果要使程序自适应32位和64位系统,只需要将项目的& ...

  5. Fiddler 4 (利用Fiddler模拟恶劣网络环境)

    1.模拟弱网环境 打开Fiddler,Rules->Performance->勾选 Simulate Modem Speeds,勾选之后访问网站会发现网络慢了很多 解决办法去掉勾选的地方网 ...

  6. NOIP2020退役记

    Day 0 这一次因为疫情仍然没有试机,但是允许提前打开虚拟机,减少了调试虚拟机的时间 开考时,吸取上一次 \(CSP\) 的教训,先把题面看了一遍 感觉 \(T1\) 比较可做,剩下的暂时没有思路 ...

  7. mysql中table schema的基本操作

    我们通常对数据库进行的增删插检操作,是针对数据库中的文件.mysql数据库中还有一些表(是view,只能做select操作)记录了现有表的meta data,比如某个column的名字,它的定义是什么 ...

  8. 【题解】AcWing 193. 算乘方的牛

    原题链接 题目描述 约翰的奶牛希望能够非常快速地计算一个数字的整数幂P(1 <= P <= 20,000)是多少,这需要你的帮助. 在它们计算得到最终结果的过程中只能保留两个工作变量用于中 ...

  9. Eclipse设置自动提示

    Eclipse设置自动提示可通过以下方式实现, 1.运行Eclipse开发工具,在开发工具最顶端菜单栏,点击"windows"->"preferences" ...

  10. 如何将 Dapper 换成 SqlSuagr ORM

    为什么要写这篇文章 因数我看到很多人虽然用着SqlSugar,但是同时也用着Dapper,因为SqlSugar兼容了Dapper所有API,所以既然你用了SqlSugar那么就没有必要在同一个项目中使 ...