继 承

继承的格式:Class Zi extends Class Fu

 

JAVA类支持单继承类(接口可以多继承接口)

但是java支持多重继承。A继承B  B继承C  C继承D。

 

子父类出现后,类中的成员都有了哪些特点:

1:成员变量。

当父子类中出现一样的属性时,子类类型的对象,调用该属性,值是子类的属性值。属性这一项不适用于多态特性。

如果想要调用父类中的属性值,需要使用一个关键字:super

this:代表是本类类型的对象引用。

super:代表是子类所属的父类中的内存空间引用。

注意:子父类中通常是不会出现同名成员变量的,因为父类中只要定义了,子类就不用在定义了,直接继承过来用就可以了。

2:成员函数。

当子父类中出现了一模一样的方法时,建立子类对象时会运行子类中的方法。好像父类中的方法被覆盖掉一样。这种情况,是方法的一个特性:覆盖(复写,重写)

什么时候使用覆盖呢?当一个类的功能内容需要修改时,可以通过覆盖来实现。

3:构造函数。

发现子类构造函数运行时,先运行了父类的构造函数。为什么呢?

原因:子类的所有构造函数中的第一行,其实都默认有一条语句super();

super(): 表示父类的构造函数,并会调用于参数相对应的父类中的构造函数。而super():是在调用父类中空参数的构造函数。

为什么子类对象初始化时,都需要调用父类中的函数?

子类继承父类,会继承到父类中的成员,所以必须要看父类是如何对自己的成员进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。

 

注意:子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();

如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。

如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

 

问题:super()和this()是否可以同时出现的构造函数中。

两个语句只能有一个定义在第一行,所以只能出现其中一个。因为初始化的动作要最先完成,所以这两个语句能能出现在第一行。

 

方法重写时的注意事项:

1:子类覆盖父类时,要实现:权限大于等于父类权限,返回值类型小于等于父类(小于是指子类方法返回值类型是父类方法返回值类型的子类),抛出的异常小于等于父类抛出的异常。

2:静态方法只能覆盖静态方法,或者被静态方法覆盖。

 

继承的一个弊端:打破了封装性。对于一些类,或者类中功能,是不需要被继承,或者复写的。这时需要使用一个关键字,final。

 

final特点:(final字面意思是最终的)

1:这个关键字是一个修饰符,可以修饰类,方法,变量。

2:被final修饰的类是一个最终类,不可以被继承。(所谓的太监类)

3:被final修饰的方法是一个最终方法,不可以被覆盖。

4:被final修饰的变量是一个常量,只能赋值一次。

 

抽 象 类

在不断抽取过程中,将共性内容中的方法声明抽取,但是方法体不一样,没有抽取。这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。

抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。

 

抽象类的特点:

1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(abstract关键字可以描述类和方法,不可以描述变量)。

2:抽象方法只定义方法声明,并不定义方法实现。

3:抽象类不可以被创建对象(实例化)。

4:子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

 

抽象类的细节:

1:抽象类中是否有构造函数?有,用于给子类对象进行初始化。

2:抽象类中可以定义非抽象的方法。

3:关键字abstract和哪些修饰符不可以共存?final ,  private , static

4:抽象类中的方法可以都不定义成抽象方法,只不过该抽象类不能被实例化。

 

模板方法设计模式:当类内部有一部分功能确定,一部分功能不确定时。这时可以把不确定的部分声明为抽象方法,让子类去实现。

abstract class GetTime{
public final void getTime(){ //此功能如果不需要复写,可加final限定
long start = System.currentTimeMillis();
code(); //不确定的功能部分,提取出来,通过抽象方法实现
long end = System.currentTimeMillis();
System.out.println("毫秒是:"+(end-start));
}
public abstract void code(); //抽象不确定的功能,让子类复写实现
}
class SubDemo extends GetTime{
public void code(){ //子类复写功能方法
for(int y=0; y<1000; y++){
System.out.println("y");
}
}
}

 

接 口

用关键字interface定义接口,接口中包含的成员有全局常量、抽象方法。

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

成员变量:public static final

成员方法:public abstract

 

接口中有抽象方法,说明接口不可以实例化。接口的子类必须实现了接口中所有的抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

 

类与类之间存在着继承关系,类与接口中间存在的是实现关系。继承用extends  ;实现用implements 。

 

接口和类不一样的地方,就是,类可以实现多个接口,但只能继承一个类。

一个类在继承另一个类的同时,还可以实现多个接口。所以接口的出现避免了单继承的局限性。还可以将类进行功能的扩展。

 

其实java中是有多继承的。接口与接口之间存在着继承关系,接口可以多继承接口。使用extends关键字。

 

如何理解接口:(拿USB接口来类比)

1:接口是对外提供的规则。USB接头有同样的规格。

2:接口是功能的扩展。通过电脑USB接口可以连接各种设备。

3:接口的出现降低了耦合性。想让电脑有相机的功能,就连一个摄像头,不想用摄像头就拿掉。摄像头存不存在对电脑自身没有影响。

 

抽象类和接口的区别:

1:抽象类只能被继承,而且只能单继承。接口需要被实现,而且可以多实现。

2:抽象类中可以定义非抽象方法,子类可以直接继承使用。接口中都是抽象方法,需要子类实现后使用。

3:类继承抽象类,类似is a 的关系。类实现接口,类似 like a 的关系。

4:抽象类的成员修饰符可以自定义。接口中的成员修饰符是固定的。