1.继承,多态,抽象类与接口

一.类的继承

继承在面向对象开发思想中是一个非常重要的概念,它使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类,不仅可以减少软件开发周期,也可以提高软件的可维护性和可拓展性。

一个类继承另一个类需要使用关键字extends,关键字extends的使用方法如下:

class Child extends Parent{}

子类在继承父类之后,创建子类对象的同时也会调用父类的构造方法,父类pareent和子类Child都各自有一个无参的构造方法,在main()方法中创建子类对象时,java虚拟机会先执行父类的构造方法,然后再执行子类的构造方法。

子类继承父类之后调用父类创建好的属性和方法。 父类和普通类写法相同。

所有类的构造方法第一行都有一个隐藏的“superc";作用是在执行构造方法之前调用其父类构造方法。

子类Mobile 类仅创建了一个显示屏属性,剩余的其他属性和方法都是从父类Telephone类中的继承。

例如:绝大多数动物有眼睛,鼻子和嘴,犬类继承动物,所以犬类也有眼睛,鼻子和嘴。

这三个的继承关系就是Husky类继承Dog类继承Animal,虽然Husky类没有直接继承Animal类,但是Husky类可以调用Animal类提供的可被继承的成员变量和方法。

Object类

在Object类中,主要包括clone(),finalize(),equasl(), soString()方法,其中常用的两个方法为equasl()和toString()方法,由于所有的类都是Object类的子类,所以任何类都可以重写Object类中的方法。

Object类中的getClass(), notify() ,wait()等方法不能被重写因为这些方法被定义为fmal。

1.getClass()方法

getClass()方法是Object类定义的方法,它会返回对象执行时的class实例,然后使用此实例调getName()方法可以取得类的名称。

2.toString()方法

toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。

方法的重写,返回参数相同,方法名相同,传入参数相同,方法体不同。

3.equals()方法

在java语言中,有两种比较对象的方式,分别为“==”运算符与equasl()方法

二.对象类型的转换

1.向上转型

向上转型可以被理解为将子类类型的对象转换为父类类型的对象,即把子类类型的对象直接赋值给父类类型的对象,进而实现按照父类描述子类的效果。

向上转型:将子类对象赋值给父类引用。

向下转型:将父类对象赋值给子类引用。

两个没有继承关系的对象不可以进行向上转型或者向下转型。

父类对象可以强制转换为子类对象,但有一个前提:这个父类对象要先引用这个子类对象。.

三.使用instanceof关键字判断对象类型

当在程序执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型之前需要养成一个良好的习惯,就是判断父类对象是否为子类对象的实例,这个判断通常使用instanceof关键字来完成。

myobject:某类的对象引用。

ExampleClass:某个类

使用Instanceof关键字的表达式返回值为布尔值

创建Quadrangle四边形,Square正方形类和Circular圆形类。因为四边形类与圆形类没有继承关系,因此两者不能使用instanceof关键字进行比较,否则会发生不兼容错误。

四.方法的重载

构造方法都需要根据类名进行命名,为让方法名相同而形参不同的构造方法同时存在,必须用到方法重载。

创建OverloadTest类,在该类中编写add()方法的多个重载形式,然后在主方法中分别输出这些方法的返回值。

五.final关键字

final变量

final关键字定义的变量必须在声明时对其进行赋值操作,final除了可以修饰基本数据类型的常量还可以修饰对象引用,

final方法

将方法定义为final类型,可以防止子类修改父类的定义与实现方式,同时定义为final的方法的执行效率要高于非final 方法。

fianal类

定义为final的类不能被继承,如果希望一个类不被任何继承,并且不允许其他人对这个类进行任何改动,可以将这个类设置为final类。final()

六.多态

利用多态可以使程序具有良好的括展性,并可以对所有类对象进行通用的处理。这种子类对象视为父类对象的做法称为“向上转型”

例如:现在要编写一个绘制图形的方法draw(),如果传入正方形对象就绘制正方形,如果传入圆形对象就绘制圆形,这样的处理能够很好的解决代码冗余问题,同时程序也易于维护。

同时,只要实例化一个继承父类的子类对象,即可调用相应的方法,如果需求发生了变更,只需要维护一个draw()方法。