知识点
接口:
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(); } } }
构造方法特点:
-
构造方法名称必须和类型保持一致。
-
构造方法没有具体的返回值。