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()方法。