学习Java的Day04

知识点

接口:

  1.接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类

 

  2. 接口中只允许出现抽象方法,不能出现非抽象方法

 

  3. 接口的源文件也是java文件,编译后的文件也是.class,所以可以把接口看作一个特殊的类

 

注意:

  • 接口是供别的类去实现的,并且要实现他的抽象方法的,所以接口中方法的访问修饰符必须定义成public

  • 接口中不能定义普通的成员变量,只能定义成public static final 成员变量

  • 一个类可以同时实现多个接口,但是需要将抽象方法进行实现,创建接口的时候修饰符可以省略, 系统会自动加上,实现的时候,就必须要添加public

接口的特点:

  • 接口不能创建对象

  • 接口的变量使用public static final修饰,如果不写默认添加

  • 接口的方法为public abstrict,如果不写默认添加

  • 子类必须重写接口中所有的抽象方法后,才能创建对象,

  • 如果子类不不能够重写所有的抽象方法,那么子类必须定义成抽象类

接口的作用:

  • 扩展原有类的功能
  • 设定规则
  • 降低耦合性

问题分析:

1.为什么接口可以实现多继承????

  答:因为接口中的方法都是没有实现的,所以就算有两个父接口的方法名称相同,子类实现接口的时候也不会有什么影响,

    只要重写即可,所以接口与接口之间是存在多继承的。

小小练习:

package com.day04;

public interface HDMI {

    //获取输入信号名称
    void  input();

    //获取设备名称
    String  getName();
}

///////////////////////////////////////////////////////////

class computer implements HDMI{

    @Override
    public void input() {
        System.out.println("电脑信号输入。。。。。。");
    }

    @Override
    public String getName() {

        return "电脑设备";
    }
}

/////////////////////////////////////////////////////////////

class GameMachine implements HDMI{
    @Override
    public void input() {
        System.out.println("游戏机信号输入。。。。。。");
    }

    @Override
    public String getName() {
        return "游戏机设备";
    }
}

//////////////////////////////////////////////////////////////////

class  TV {
    public  void output(HDMI hdmi ) {
        //设备录入
        hdmi.input();
        //获取设备名称
        System.out.println("设备名称为:" +hdmi.getName());
    }
}

class  TestHDMI{

    public static void main(String[] args) {
        //呈现电脑画面
        computer com = new computer();
        GameMachine game = new GameMachine();
        //准备终端设备
        TV tv = new TV();
        tv.output(game);
    }
}

 

 

多态: 当一个类能表现出多种状态的时候,我们称这种现象为多态现象


多态的表现形式:让父类的变量去指向子类对象的地址

条件:必须有继承关系

多态的表达形式:  父接口/父类   变量  =   new     子类/父接口的实现类的对象

 

注意:同一个父类的方法会被不同的子类重写。在调用方法时,调用的为各个子类重写后的方法。

多态的特点 

  • 对于成员方法:编译的时候看=左边,运行的时候看=右边

  • 对于成员变量:编译的时候看=左边,运行的时候看=左边

 

instanceof关键字

  如果直接进行强制转换的时候有可能会出现问题,所以可以使用instanceof进行判断如 对象 instanceof 类名  判断左边的对象与右边的变量是否有所属关系。

 练习简单的多态

package com.day04.work01;

import java.util.Random;

public class People {
    /*
    定义一个类是People,定义两个类,一个是Man,一个是 Woman,Man中有个属性是老婆,有一个方法 lol,
    Woman中有个属性是老公,有一个方法shopping,
    还 有一个方法生孩子,先判断是否有老公,如果有,就创建 一个对象50%概率是man,50%概率是woman,有一个 返回值,
    最后如果是男的调用lol,如果是nv的调用 shopping
     */
}

class Man extends People {

    Woman laopo;

    void lol() {
        System.out.println("玩LOL。。。。。。");
    }

}

class Woman extends People {

    Man laogong;

    void shopping() {
        System.out.println("购物。。。。。。。");
    }

    public People getBaby() {

        People peo = null;
        if (laogong != null) {
            Random ran = new Random();
            int x = ran.nextInt(2);
            if (x == 0) {
                peo = new Man();
            } else if (x == 1) {
                peo = new Woman();
            }
        }
        return peo;
    }
}

class TestPeople {
    public static void main(String[] args) {
        Man man = new Man();
        Woman woman = new Woman();
        woman.laogong = man;

        People peo = woman.getBaby();
        if (peo == null) {
            System.out.println("没有老公,不能生孩子");
            return;
        }
        if (peo instanceof Man) {
            Man m = (Man) peo;
            m.lol();
        } else {
            Woman wo = (Woman) peo;
            wo.shopping();
        }

    }
}

  

构造方法特点:

  • 构造方法名称必须和类型保持一致。

  • 构造方法没有具体的返回值。

为什么子类的构造方法会去调用父类的构造方法呢????

 

   因为构造方法本身就是初始化对象的成员变量的,父类 的构造方法也是这个目的,如果不去调用,我们就不知道父类做了什么操作,所以才会隐式的去调用super();

 

子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。这样,才可以使用父类中的内容。

 

 

如果子类会默认调用父类的无参构造方法,如果父类中又没有无参的构造方法,程序会出现什么问题?编译器 会自动去找到对应的有参的构造方法么?????

 

  如果父类中没有空参构造方法,那么子类的的构造方法 就会报错,需要我们显示的调用父类的有参数的构造方法

 

猜你喜欢

转载自www.cnblogs.com/ZhuX-H/p/13205052.html