一.类的继承
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()方法中做一些限定就可以根据不同图形类对象绘制相应的图形。这样处理能够很好地解决代码冗余问题,同时程序也易于维护。
八:抽象类和接口
在解决实际问题同时,一般将父类定义为抽象类需要使用这个父类进行继承与多态处理 回想继承和多态原理,继承书中越是在上方的类月抽象,如鸽子类继承鸟类 ,鸟类继承动物类等在多态机制中,并不需要将父类初始化为对象 ,我们需要的只是子类 所以在Java语言中设置抽象类不可以实体化为对象
使用abstract关键字定义的类成为抽象类,而使用这个关键字定义的方法称为抽象方法。抽象方法没有方法体 这个方法本身没有任何意义,除非他被重写,而承载这个抽象方法的抽象必须被继承实际上抽象类除了被继承没有任何意义 定义语法如下
public abstract class Parent{
abstract void testAbstract();
}
反过来讲 如果声明一个对象方法,就必须将承载这个抽象方法的类定义为抽象类,不能再非抽象类中获取抽象方法 换句话说只要类中有一个抽象方法,此类被称为抽象类
将绘图方法设为接口方法
代码
package 第七章继承;
interface Paintable{//可绘制接口
public void draw();//绘制抽象方法
}
public class Quadrangle1 {
public void doAnything() {
System.out.println("四边形提供的方法");
}
}
//平行四边形类,继承四边形类,并实现了可绘制接口
class Parallelogram extends Quadrangle1 implements Paintable{
public void draw() {//由于该类实现了接口,所以需要覆盖draw方法
System.out.println("绘制平行四边形");
}
}
//正方形继承平行四边形,并实现了可绘制接口
class Squareab extends Quadrangle1 implements Paintable{
public void draw() {
System.out.println("绘制正方形");
}
}
//圆形类,仅实现可绘制接口
class Circularab implements Paintable{//圆形类实现接口
public void draw() {
System.out.println("绘制圆形");
}
}
public class Demo7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Squareab q=new Squareab();//正方形对象
q.draw();
q.doAnything();
Parallelogram p=new Parallelogram();//平行四边形对象
p.draw();
p.doAnything();
Circularab c=new Circularab();//圆形对象
c.draw();
}
}
运行结果