黑马程序员_day10_接口、多态

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

当一个抽象类中全都是抽象方法的时候,

这时,可以将这个抽象类定义成接口。

接口的成员。都有固定的修饰符。

常见:

1,常量。全局常量 有固定修饰符 public  static final 

2,抽象方法。固定修饰符 public abstract 

interface Inter

{

public static final int NUM = 3;

public abstract void show();

public abstract void method();

}

接口定义特点:

1,接口用interface来定义。

2,接口中的成员都有固定的修饰符。

3,接口不能被实例化,。

4,接口必须由其子类覆盖了所有的抽象方法后,该子类才可以实例化。

否则,该子类还是一个抽象类。

5,接口中的成员都是public修饰的。 

类与类之间是继承关系,

类与接口之间是实现关系。

接口的出现好处:

接口可以被多实现。这就是多继承机制在java语言被改良后的结果。

一个类可以实现多个接口。

一个类在继承一个类的同时还可以实现多个接口。

类与类之间是继承,而且是单继承。

类与接口之间是实现,而且可以多实现。

接口与接口之间是继承关系,而且可以多继承。

1,接口的出现降低了耦合性。

2,接口的出现提高了扩展性。

3,接口就是对外暴露的规则。

接口和抽象类的区别:

1

类是用来继承的,只能单继承。

接口是用来实现的,可以多实现。

2

类中可以定义非抽象内容,直接提供给子类使用。

接口中只能定义抽象方法,需要子类全部实现。 

3

类存在着继承关系,是is a关系。

接口的实现关系,是 like a 关系。

共同点:

它们都是不断抽取而来的。 

interface Inter

{

void show1();

void show2();

void show3();

void show4();

}

子类在实现接口的时候,需要覆盖四个方法,

但是子类就想一个方法进行具体内容的指定。

其他方法不需要用到。 

但是为了创建对象,还必须要覆盖。

如果又有其他子类要用到其中一个方法,

还是如此要覆盖四个方法。

怎么办

创建一个没有抽象方法的抽象类如下,可以方便创建接口对象,去覆盖指定的功能。

abstract class Test implements Inter

{

public void show1(){}

public void show2(){}

public void show3(){}

public void show4(){}

}

多态

多种形态。

这里要重点讲的就是对象的多态性。

狗 x = new ();

动物 y = new ();//对象的多态性,狗对象即是狗类型,又是动物形态。 

必须要明确一点:狗是动物中的一种。

意味着狗是需要继承动物的才可以这样指向。

多态性:在程序中的体现。

就是:父类或者接口的引用指向自己的子类对象。

好处:提高了代码的扩展性。 

弊端:前期建立父类的引用虽然可以接收后期所有该类的子类对象。

  但是只能使用父类中的功能呢,不能使用子类中的特有功能,

  因为前期的程序无法知道后期的子类的特有内容的。 

  但是前期的程序可以使用子类覆盖了父类的方法的内容。 

前提:

1,必须存在着继承关系。

2,通常要有覆盖操作。 

什么时候使用向上转型,和向下转型呢?

当需要对程序进行扩展,或者限定对对象的方法操作时,使用向上转型。

操作其父类型。

当要使用子类的特有的内容时,就需要向下转型。

转型前一定要判断,否则容易出现问题。

注意:在这个转型过程中,自始自终都是一个子类对象在做着类型的变化而已。

在进行子类特有方法使用时,要进行向下转型,

转型前一定要做判断。否则容易发生ClassCastException

判断引用类型,要使用一个关键字完成。关键字: instanceof

对象 instanceof 类型

这个判断是向下转型前的健壮性判断。 

多态的出现在成员调用上的特点:

1,成员变量

编译时期:参考的是引用型变量所属的类中是否有调用的成员变量,如果有,编译通过,如果没有编译失败。

运行时期:调用的也是引用型变量所属类中的成员变量。

简单说:编译和运行都看等号的左边。

其实这种情况不多见。

2,成员函数。 

编译时期;参考的是引用型变量所属的类中是否有调用的方法。有,编译通过,没有编译失败。

运行时期:参考的是对象所属的类中是否有调用的方法,如果有运行子类自己的方法,如果没有就父类的方法。 

简答说:编译时期看左边,运行时期看右边。

因为函数有一个覆盖的特性。 

非静态方法需要和当期运行的对象进行动态绑定,哪个对象调用了这个方法,这个方法就所属于哪个对象。 

就会运行哪个对象的中的方法。 

3,静态函数。

编译时期:参考的是引用型变量所属的类中是否该方法。

运行时期:参考的也是引用型变量所属的类中的方法。 

简单说:编译和运行都看左边。

因为静态方法是不所属于对象的,是所属于类的,

它会类加载的时候,静态的绑定到所属的类上。 

Object:所有类的父类。 

所有对象都具备的内容不断地抽取,就到了一个顶层Object类中。

equals/通常在开发时,每一个对象都具备该方法,但是每个对象都有自己的属性的比较方式。

所以都会覆盖该方法建立每个对象自己特定的判断相同的依据。

toString为了让自定义的对象对应的字符串表现形式有意义。覆盖toString即可。

getClass():获取任意一个对象所属的字节码文件对象。

hashCode():获取对象的哈希值。

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值