面向对象基本特征
类的封装性
封装性有两个含义,一是把对象的全部属性和方法结合在一起,形成一个不可分割的独立单位,对象的属性一般只能由对象本身的方法来访问。二是尽可能隐蔽内部细节,与外部的联系只通过外部接口实现。
类的多态性
多态性是指相同方法名的若干方法,具有不同的实现方式(即方法体不同)。多态性有两种表现形式
(1)方法重载(overloading):又称为静态多态性,即同一类中可以有多个同名方法,但是这些方法的 参数个数、参数类型、参数顺序 不能完全相同。返回类型不要求完全相同,但是在返回类型不同的情况下,参数仍然应遵守原则不能完全一样。
(2)方法覆盖(overriding):又称为动态多态性,即子类可以对父类的方法进行重新定义,而且除了方法名相同,还要求其返回类型、参数形态(类型和顺序)完全一样。
方法重载
//传入不同个数参数,
//传入两个参数,表示矩形
public double area (float a, float b){
return a*b;
}
//传入三个参数,表示三角形
public double area (float a, float b, float c){
float d = ( a + b + c ) / 2;
return Math.sqrt( d * (d-a) * (d-b) * (d-c) )
}
//传入一个参数,表示圆
public double area (float a){
return Math.PI * a * a;
}
//返回类型可以不同
public String area (){
return "这也是重载";
}
//在返回类型不同的情况下,参数仍然不能完全一样
public String area (float a){
return "这会报错";
}
方法覆盖
当子类和父类中有同名的且同参数形态方法时,子类中的方法会覆盖父类的方法。此时父类对象调用父类方法,子类对象调用子类方法。
方法覆盖的重要规则:
(1)子类重写的方法和父类中被重写的方法要具有相同的名字、参数表和返回类型。只有方法体内允许不同。
(2)子类覆盖的方法不能缩小父类方法的权限。Java要求子类的成员方法应该比父类有更高的访问权限。 访问权限由大到小以此为:public>protected>default>private。
(3)覆盖只存在于父类和子类之间,同一个类中的方法不能被覆盖。
(4)父类的静态方法不能被子类覆盖为非静态方法;父类的非静态方法也不能被覆盖为静态方法。可以在子类中定义与父类静态方法同名的静态方法以在子类中隐藏父类的方法。
(5)父类的私有方法不能被覆盖。
(6)final修饰的方法不能被覆盖。
类的继承性
Java中被继承的类叫做父类或者超类(Superclass),继承父类的类叫子类(Subclass),子类是父类的某个专门用途的具化版本。子类定义的格式:
[修饰符] class 子类名 extends 父类名{
子类体
}
类与类之间的继承关系可以传递,如果类A继承了类B,类B继承了类C,那么类A也同时继承了类C。
方法覆盖的重要规则:
(1)Java只支持单继承,不支持多重继承。一个父类可以被多个子类extends,但是一个子类只能extends一个父类。
(2)父类中private的成员不能被子类继承。
(3)子类的成员和父类同名时,父类的成员被覆盖而不是被继承。
向上转型
java中子类可以实现到父类的类型转换,这种转换被称为向上转型。
JPeople p1 = new JStudent(); //子类JStudent向父类JPeople转型
父类到子类的直接转型则不被允许
JStudent p3 = new JPeople(); //父类JPeople到子类JStudent进行转型不被允许,会报错
向上转型是安全的,是面向对象设计代码重用的基础。
super关键字
super关键字表示对某个类的超类的引用,常用于访问被子类隐藏的超类成员或调用超类的构造方法。
构造方法继承性
子类中可以通过super关键字调用父类中定义的构造方法,其中参数需要和父类构造方法规定的一样。
子类和父类之间构造方法继承的原则:
1.按继承关系,构造方法是从上(父)向下(子)进行调用的。
2.若子类无构造方法,则它默认调用父类的无参构造方法,若父类中不存在无参构造方法,则报错。
2.若子类有构造方法,则先执行父类构造方法,后执行子类构造方法。
3.若子类有构造方法,但子类构造方法中没有使用super关键字,则系统执行该构造方法时会产生super()代码,来首先调用父类的无参构造方法。
4.若父类中包含有参构造方法,子类可以通过在自己构造方法中使用super()关键字来调用,而且必须是子类构造方法的第一句。
补充:
所谓继承,其实子类中并没有完全复制父类的内存空间,而是对父类属性和方法存储的位置加以引用。除非子类对方法进行重写或有同名属性,否则就不会单独分配空间。因此子类中调用继承自父类的方法,本质上还是去父类中寻找这个方法并进行调用。改变子类中继承下来的父类属性,在父类中也可以看到变化。
更多知识关注轻课网
轻课网