JAVA面向对象笔记
super关键字
(1) 关于super关键字调用父类的成员变量和成员方法,具体格式如下:
super.成员变量
super.成员方法([参数1,参数2,…])
(2)使用super关键字调用父类的构造方法,具体格式如下:
super([参数1,参数2…])
注意:通过super调用的构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次,否则程序在编译期间就会报错。
Object类
在java中提供了一个Object类,他是所有类的父类,即每个类都是直接或者间接继承自该类,因此Object类通常被称为超类、基类、或根类。当定义一个类时,如果没哟使用extends关键字为这个类显示地指定父类,那么该类会默认继承Object类。
Object类中自定义了一些方法,其中常用的方法如下:
方法声明 | 功能描述 |
---|---|
boolean equals(Object obj) | 判断某对象与此对象是否相等 |
final Class<?>get Class | 返回此Object的运行时类 |
int hashCode() | 返回该对象的哈希码值 |
String toString() | 返回改对象的字符串表示 |
void finalize | 垃圾回收器调用此方法来清理没有被任何引用变量所引用对象的资源 |
final关键字
final关键字可用于修饰类、变量和方法,它有“不可更改‘或者”最终“的含义,因此被final修饰的类、变量、和方法将具有以下特征:
(1) final修饰的类不能被继承。
(2)final修饰的方法不能被子类重写。
(3)final修饰的变量是常量,只能进行赋值一次。
抽象类和接口
抽象类:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时候这些方法的实现方式是无法确定的。抽象类方法必须使用abstract关键字来修饰,并在定义方法时不需要实现方法体。当一个类中包含了抽象的方法,那么该类也必须使用abstract关键字来修饰,这种使用abstract关键字修饰的类就是抽象类。抽象类以及抽象方法的定义基本语法格式如下:
//定义修饰类
[修饰符]abstract class 类名(
//定义抽象方法
[修饰符]abstract 方法返回值类型 方法名([参数列表]));
//其他方法或属性
}
注意:包含抽象方法的类必须定义为抽象类,但抽象类中可以不包括任何抽象方法。另外,抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想调用抽象类中定义的抽象方法,需要创建一个子类,在子类中调用抽象类中的抽象方法。
接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类定义为Java中的另一种形式——接口。接口是一种特殊的抽象类,它不能包含普通方法,其内部的所有方法都是抽象方法,它将抽象类进行的更为彻底。在JDK8中,对接口进行了重新定义,接口中出了抽象方法歪,还有可以默认方法和静态方法,默认方法使用default修饰,静态方法使用static修饰,并且这两种方法都允许有方法体。与定义类不同的是,在定义接口时,不再使用class关键字,而是使用interface关键字来声明。与接口定义不同的基本语法结构格式如下:
[修饰符] interface 接口名 [extends 父接口1,子接口2,...]{
[public [static] [final]常量类型 常量名 =常量值;
[public [abstract] 方法返回值类型 方法名 ([参数列表]);
[public] default 方法返回值类型 方法名 ([参数列表]){
//默认方法的方法体
}
[public] static 方法返回值类型 方法名 ([参数列表]){
//类方法的方法体
}
}
注意:上述语法格式中,"[]"中的内容都是可选的,修饰符可以使用public或直接省略。“extends父接口1,父接口2,…"表示定义一个接口时,可以同时继承多个父接口,这也是为了解决类的单继承的限制。在接口内部可以定义多个常量和抽象方法,定义常量事必须进行初始化赋值,定义默认方法和静态方法时,可以有方法体。
由于抽象方法和默认方法只能通过接口实现类的实例对象来调用。因此需要定义一个接口的实现类,该类通过implements关键字实现当前接口,并实现接口中的所有抽象方法(否则会报错)。
注意:一个类可以再继承另一个类的同时继承多个接口,并且多个接口之间需要使用英文(,)分隔。
定义接口的实现类语法格式如下:
[修饰符]class 类名 [extends 父类名] [implements 接口1,接口2,...]{
...
}
接口的特点:
1、 从JDK8开始,接口中的方法除了包含抽象方法外,还包含默认方法和静态方法,默认方法和静态方法都可以有方法体,并且静态方法可以直接通过“接口.方法名”来调用。
2、当一个类实现接口时,如果这个类是抽象类,只需实现接口中的部分抽象方法即可,否则需要实现接口中的所有抽象方法。
3、一个类可以通过implements类关键字同时实现多个接口,被发现的多个几口之间要用英文(,)隔开。
4、接口之间可以通过extends关键字实现继承,并且一个接口可以同时继承多个接口,接口之间用英文逗号隔开。
5、一个类在继承一个类的同时还可以实现接口,此时,extends关键字必须位于implements关键字之前。
多态
多态的概述:在java中,多态指的是不同类的对象在调用同一个方法时所呈现出的多种不同行为。通常,在一个类中定义的属性和方法被其他类继承或重写之后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现的多种不同状态。通过多态,消除了类之间的耦合关系,大大提高了程序的可扩展性和可维护性。
对象的类型转换
将子类对象当做父类使用时不需要任何显示声明,需要注意的是,此时不能通过父类变量去调用子类特有的方法。在进行向下类型转换时,必须转换为本质类型,否则转换时会报错。为避免创建类型出错,java提供了一个instanceof关键字,他可以判断一个对象是否为某个(或者接口)的实例或者子类实例。
内部类
在java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。在实际情况中,根据内部类的位置、修饰符合定义方式的不同,内部类可以分为4中形式:成员内部类、局部内部类、静态内部类和匿名内部类。
成员内部类:在一个类中除了可以定义成员变量、成员方法、还可以定义类,这样的类被称作成员内部类。在成员内部类中,可以访问外部类的所有成员,包括成员变量和成员方法;在外部类中,同样可以访问内部类的变量和方法。
局部内部类:也称为方法内部类,就是定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法内部。在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法只能在创建该局部内部类的方法中进行访问。
静态局部类:就是使用static关键字修饰的成员内部类。与成员类部类相比,在形式上,静态内部类知识在内部类前增加类Static关键字,但在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类从而直接通过内部类访问内部类成员。
匿名内部类:在java中调用某一个方法时,如果该方法的参数是一个接口类型,出了可以传入一个参数接口实现内,还可以使用匿名内部类实现接口来作为该方法的参数。匿名内部类其实就是没有名称的内部类,在调用含有接口类型参数的方法时,通常为了简化代码,不会创建一个接口的实现类作为方法参数传入,而是直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。