一.类的继承
1.在Java语言中,一个类继承另一个类需要使用关键字extends,关键字extends 的使用方法如下:
class Child extends Parent {}
因为Java 只支持单继承,即一个类只能有一个父类,所以类似下面的代码是错误的:
class Child extends Parent1, Parents2 {}
2.所有类的构造方法第一行都有一个隐藏的“super()”;作用是在执行该构造方法之前调用其父类构造方法。
二.Object类
在 Object 类中,主要包括 clone()、finalize(),equals()、toString()等方法,其中常用的两个方法为equals()和 toString()方法。由于所有的类都是 Object类的子类,所以任何类都可以重写 Object 类中的方法。
1.getClass()方法
getClass()方法是 Object 类定义的方法,它会返回对象执行时的 Class 实例,然后使用此实例调用getName()方法可以取得类的名称。
getClass().getname();
可以将 getClass0方法与 toString0方法联合使用.
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个 String 实例。在实际的应用通常重写 toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接将自动调用重写的 toString0方法。
3.equals()方法
作Java 语言中,有两种比较对象的方式,分别为"=="定理将与 equals()方法,两者的区别在于"=="比较的是两个对象引用内布地提是否相等,而equals()方法比较的是两个对象的实际内容。
方法的重写
返回参数相同、方法名相同、传入参数相同、方法体不同。
三.对象类型的转换
1.向上转型
向上转型可以被理解为将子类类型的对象转换为父类类型的对象,即把子类类型的对象直接赋值会文类类型的对象,进而实现按照父类描述子类的效果。
2.向下转型
向下转型可以被理解为将父类类型的对象转换为子类类型的对象。但是,运用向下转型,如果个数验象的类的对象转换为一个较具体的类的对象,这样的转型通常会出现错误。
子类类型 子类对象 = (子类类型)父类对象; |
3.使用instanceof关键字判断对象类型
在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生 ClassCastExceptio异常,所以在执行向下转型之前需要养成一个良好的习惯,就是判断父类对象是否为子类对象的实例这个判断通常使用 instanceof关键字来完成。可以使用 instanceof关键字判断是否一个类实现了某个,也可以用它来判断一个实例对象是否属于一个类。
四.方法的重载
方法的重载就是在同一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。
虽然在方法重裁中可以使两个方法的返回类型不同,但只有返回类型不同并不足以区分两个方法的重载,还需要通过参数的个数以及参数的类型来设置。
五.final关键字
1.关键字
final 关键字可用于交量声明,一旦该变量被设定,就不可以再改变该变量的值。通常,由 fnal定义的变量为常量。例如,在类中定义 PI值,可以使用如下语句:
final double PI = 3 14;
当在程序中使用到 PI 这个常量时,它的值就是 3.14。如果在程序中再次对定义为 fnal 的常量赋值编译器将不会接受。
final关键字定义的变量必须在声明时对其进行赋值操作。final 除了可以修饰基本数据类型的常量还可以修饰对象引用。由于数组也可以被看作一个对象来引用,所以 fnal 可以修饰数组。一旦一个对象引用被修饰为 final后,它就只能恒定指向一个对象,无法将其改变以指向另一个对象。一个既是 static又是 final 的字段只占据一段不能改变的存储空间。
2.final方法
将方法定义为 final 类型,可以防止子类修改父类的定义与实现方式,同时定义为final的方法的执行效率要高于非final方法。在修饰权限中曾经提到过 private 修饰符,如果一个父类的某个方法被设置为 private,子类将无法访问该方法,自然无法覆盖该方法。也就是说,一个定义为 private 的方法隐式被指定为final类型因此无须将一个定义为 private 的方法再定义为 final类型。
private final void test(){
···//省略一些程序代码
}
3.final类
定义为final 的类不能被继承。如果希望一个类不被任何类继承,并且不允许其他人对这个类进行任何改动,可以将这个类设置为final类。final类的语法如下:
final 类名{}
如果将某个类设置为 final类,则该类中的所有方法都被隐式设置为 fnal方法,但是 fnal类中的成员变量可以被定义为final或非final形式。
六.多态
假如现在要编写一个绘制图形的方法 draw(),如果传入正方形对象就绘制正方形,如果传入圆形对象就绘制圆形,这种场景可以使用重载来实现,定义如下:
public void draw(Square s){ //绘制正方形的方法
}
public void draw(Circular c){ //绘制圆形的方法
}
但是这种写法有个问题:正方形和圆形都是图形,这场景细分的重载方式不仅增加了代码量,还降低了“易用度”。如果定义一个图形类,让它处理所有继承该类的对象,根据“向上转型”原则可以使每个继承图形类的对象作为 draw()方法的参数,然后在 draw()方法中做一些限定就可以根据不同图形类对象绘制相应的图形。这样处理能够很好地解决代码冗余问题,同时程序也易于维护。
七.抽象类与接口
1.抽象类
在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。回息承和多态原理,继承树中越是在上方的类越抽象,如鸽子类继承鸟类、鸟类继承动物类等。企多态制中,并不需要将父类初始化为对象,我们需要的只是子类对象,所以在 Javi 语言中设置抽象类以实例化为对象。
使用 abstract 关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法、抽象没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继水实际上抽象类除了被继承没有任何意义。定义抽象类的语法如下:
public abstract class Parentf{
abstract void testAbstract(): //定义抽象方法
}
反过来讲,如果声明一个抽象方法,就必须将承载这个抽象方法的类定义为抽象类,不能在非抽象类中获取抽象方法。换句话说,只要类中有一个抽象方法,此类就被标记为抽象类。
抽象类被继承后需要实现其中所有的抽象方法,也就是保证以相同的方法名称、参数列表和返回值类型创建出非抽象方法,当然也可以是抽象方法。
2.接口
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。接口使用 interface 关键字进行定义,其语法如下:
public interface Paintable {
void draw(); //定义接口方法可省略 public abstract 关健字
}
public: 接口可以像类一样被权限修饰符修饰,但 public 关键字仅限用于接口在与其同名的文件中被定义。
interface:定义接口关键字。
Paintable:接口名称。
一个类继承一个父类的同时再实现一个接口,可以写成如下形式:
public class Parallelogram extends Quadrangle implements Paintable {
...
}
(1)在接口中,方法必须被定义为 public 或 abstract 形式,其他修饰权限不被 Java 编译器认可。或者说,即使不将该方法声明为 public 形式,它也是public 形式
(2)在接口中定义的任何字段都自动是 static和fnal 的。