day04_接口_多态_构造方法

接口

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

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

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

4.JDK1.8 之后,能放默认方法(default)和静态方法(static),有方法体,不允许声明普通方法

5.接口中不能声明变量,只能是公共的静态常量

常量  在声明都时候,必须初始化,常理名称全部大写  public final 数据类型 常量名 = 常量值

变量  在声明的时候,没有要求,当使用它时,必须初始化

抽象类都局限性

  1. 抽象类中有抽象方法和普通方法 ,有些乱
  2. 抽象类都本质还是类,只能单继承

接口:1.静态常量 2.公共都抽象方法

类与类之间是一种继承关系 extends  类与接口之间是一种实现关系 implements
类实现接口时,该类需要重写接口中的所有抽象方法
当一个类实现一个接口,那么该类就是该接口的实现类,或者称为子类
不管是接口,抽象类还是普通类,其本质还是Java
1.接口之间可以实现多继承
2.类和接口之间只能是实现关系,类与接口之间还可以多实现

接口特点:

接口不能创建对象

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

接口的方法为public abstract,如果不写默认添加子类必须重写接口中所有的抽象方法后,才能创建对象,如果子类不不能够重写所有的抽象方法,那么子类必须定义成抽象类

接口的意义:

扩展原有类的功能

设定了规则

降低耦合性

接口可以实现多继承的原因:接口中的为抽象方法,没有方法体,子类实现需要重写抽象方法。

接口和抽象类区别(面试题)!!!

相同点:

都位于继承的顶端,用于被其他类实现或继承;

都不能直接实例化对象;

都包含抽象方法,其子类都必须覆写这些抽象方法;

区别:抽象类可以定义非抽象方法,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;

一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)

类与类之间只能是单继承(包括抽象类),接口与接口之间可以是多实现

抽象类可以定义普通的成员变量,接口只能定义public static final的成员变量

多态:

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

多态的表现形式:让父类的变量去指向子类对象的地址
前提条件:继承关系/实现关系  父子类
多态表达形式   父接口/父类   变量  =  子类对象/父接口的实现类的对象

public static void main(String[] args) {
People pe
= new Woman();//普通类多态表现 People pe1 = new Man();//向上转型 Man man = (Man)pe1;//向下转型 man.getMoney(); //向下转型的时候,需要做校验 instanceof 所属关系 // 左边变量 instanceof 右边类型 -->左边的变量和右边的类型是否能够构成所属关系 if(pe1 instanceof Woman){ Woman woman = (Woman) pe1; woman.shopping(); }else{ System.out.println("pe1和woman没有任何关系,无法向下转型"); } } }
public abstract class Animal {

    public String color = "黑色";
    public int age = 1;
public abstract void eat();
public abstract void run();
public void sleeping() {
System.out.println(
"我在睡觉");
}
public static void main(String[] args) { Animal animal = new Cat();//抽象类的多态表现 animal.eat(); animal.run(); //成员方法 编译看左 运行看右 animal.sleeping();//猫在休息 //成员变量 编译看左 运行也看左 System.out.println(animal.color);//黑色 System.out.println(animal.age);//1 /* 编译阶段:方法能否被执行取决于该变量所在的类是否有该方法,和等号右边的对象没有关系 运行阶段:方法能否被运行,取决于等号右边的对象是否含有该方法,和等号左边的变量类型没有关系 */ } } class Cat extends Animal { public String color = "白色"; public int age = 2; @Override public void eat() { System.out.println("我在吃鱼。。"); } @Override public void run() { System.out.println("我在跑步。。"); } @Override public void sleeping() { System.out.println("猫在睡觉"); } }

构造方法:

构造方法作用:1.可以在创建对象的一刹那,完成对对象属性的赋值   2.可以用来创建对象,完成对对象属性进行初始化(默认值) 主要作用

修饰符 构造方法名(参数列表){
}

构造方法的特点:

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

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

当一个类创建的时候,系统会自动给你分配一个无参构造,如果你在该类中重新书写一个全参构造,系统会收回无参构造
如果还需要无参构造,需要你手动的声明出来,当创建对象时,系统会自动调用父类中的无参构造

父子类,父类中如果没有无参构造,子类创建继承的时候,不能够直接创建,需要显式的声明无参构造,在无参构造内部显式
的调用父类中的含有的其他构造方法

子父构造方法的调用

子类创建对象的时候,会调用父类的构造方法,在子类构造方法中的第一行总有一个隐式的调用 super(); 会默认去调用父类的无参的构造方法

思考1

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

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

须先到父类中去执行父类的初始化动作。这样,才可以使用父类中的内容。

思考2

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

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

 

猜你喜欢

转载自www.cnblogs.com/zenyang-/p/13204617.html