----------- 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学习型技术博客、期待与您交流! ------------