继承
定义:继承就是子类继承父类的所有属性(即成员变量)和所有操作(即成员方法)。
注意:是所有属性和所有操作,意味着即使是private修饰的变量或者private修饰的方法也可以继承,只不过子类访问不到而已,但是确实继承下来了。(包括构造函数也可以继承下来)。
了解继承之前,先来了解部分关键字,先说今天会用到的,其他关键字用到再说……
关键字和保留字的区别:
关键字:Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等。
保留字:为java预留的关键字。现在还没用到,但是在升级版本中可能作为关键字。
关键字:
abstract |
1.用来声明抽象类,抽象方法,抽象属性。 |
2.不能与final关键字共同使用。 |
final |
1.final可以用来修饰类,方法,变量 |
2.当用来修饰类时,表明不能被其他类继承 |
3.当用来修饰方法时,明确这个方法不能被子类方法覆盖 注:类的private方法会隐式地被指定为final方法。 |
4.修饰变量:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。 |
static |
1.static方法:static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。但是在,非静态方法中可以使用静态方法。 |
2.static变量:static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。 |
3.static代码块:static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。 |
4.不允许修饰局部变量。切记。 |
5。用对象是可以调用static成员方法或变量的,但是不建议这样使用。 |
super和this功能 |
1.普通的直接引用 ,意思就是,指向当前对象本身。(this) |
2.形参与成员名字重名,用this来区分 (this) |
3.引用构造函数 调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。 (this) |
1.普通的直接引用,与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。 (super) |
2.子类中的成员变量或方法与父类中的成员变量或方法同名 |
3.引用构造函数 super(参数):调用父类中的某一个构造函数(必须为构造函数中的第一条语句)。每个子类构造方法的第一条语句,都是隐含地调用super()。 |
保留字有:const ,goto ,friendly,sizeof。就不做介绍了。
接下来将会为大家说明,抽象类,接口,普通类,之间继承的不同及它们本身的不同。(实现,也是继承的一种哦!!!)
抽象类 |
1.如果一个类使用abstract修饰的,那它就是一个抽象类,抽象类可以有抽象方法,也可以没有。 |
2.抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。 |
3.抽象类不能用来创建对象。 |
4.如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法,如果子类,没有实现父类的抽象方法,则必须将子类也定义为abstract类。 |
接口 |
1.接口中的变量会被隐式地指定为public static final变量,并且只能是public static final。 |
2.方法会被隐式地指定为public abstract方法且只能是public abstract方法 |
3.允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。 |
接口类和抽象类之间的区别 |
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法; |
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的; |
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法; |
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。 |
5)抽象类存在构造函数,作用是提供给子类初始化父类的属性,接口不存在构造函数 |
接下来给大家讲一下更深层次的设计上的区别:
下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:
abstract class Door {
public abstract void open();
public abstract void close();
}
或者:
interface Door {
public abstract void open();
public abstract void close();
}
但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:
1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。
interface Alram {
void alarm();
}
abstract class Door {
void open();
void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() {
//....
}
void close() {
//....
}
void alarm() {
//....
}
}