一、封装
封装是面向对象的核心思想。是以类为载体,将对象的属性和行为封装起来,对外隐藏其实现细节。
封装保证了类内部数据结构的完整性,使得外部(使用该类的用户)不能轻易地直接操作此数据结构,只能执行该类的允许的公开的数据(一般指方法);从而避免外部操作对内部数据的影响,提高了程序的可维护性。
二、继承
继承主要使利用特点对象之间的共有特性,将这些共有特性抽象出来作为基类,让继承该基类的其他类都拥有该基类的特性,而不需要重复实现,同时还可以自定义各自的特有能力和属性。如:麻雀和雕都是鸟类,鸟类都有翅膀,并且可以飞。就可以将鸟类作为基类抽象出来,麻雀和雕都继承鸟类后,就继承了鸟类的翅膀属性(变量)和飞的能力(方法),同时麻雀可以自定义自己吃虫子的能力,而雕自定义自己吃肉的能力。继承原有的功能,增加自己新的功能,实现了拓展和复用。
Java中,继承使用 extends 关键字来实现,其中Java规定了java.lang.Object 类作为所有的类直接或间接的父类(当类没有继承其他类时,java默认继承Object类,当类继承了其他类时,可以向上追溯,最终继承的类就是Object类)。java规定类只能继承一个类,但是一个类可以被多个类继承(一个子类只能有一个直接父类,一个父类可以有多个子类),类之间可以有多层的继承关系,直接继承的是直接父类,父类的父类就是间接父类,而最上层就是Object。
注:
1、extends:单一继承,可以让一个类继承一个父类
2、super:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
3、this:指向自己的引用。引用自身的属性和方法。
4、final:当用final修饰类时,是把类定义为不能继承的,即最终类;
用于修饰方法时,该方法不能被子类重写;
用于修饰属性时,该属性不可被二次赋值。
三、多态
1.类的多态:
将父类对象应用于子类的特征就是多态。
如上述鸟类的例子,将子类麻雀和雕的对象都看作是父类的实例对象,当鸟类在吃东西时,就会有不同的表现形式,这就是多态的基本思想,向上转型。
instanceof:向下转型的关键字。在向上转型后,父类对象无法调用子类对象特有的方法,所以有了向下转型。
class Animals {
public void sound(){
System.out.println("动物的叫声");
}
}
class Dog extends Animals{
@Override
public void sound() {
System.out.println("汪汪汪~~~");
}
public void eat(){
System.out.println("狗在吃骨头");
}
}
class Cat extends Animals{
@Override
public void sound() {
System.out.println("喵~~~");
}
public void play(){
System.out.println("猫在玩耍");
}
}
class Test{
public static void main(String[] args) {
//向上转型
Animals a = new Dog();
// Animals a = new Cat();
a.sound();
//a.eat()方法时无法调用的,如果使用需要向下转型
//向下转型,先判断属于Dog还是Cat的实例,属于谁的实例就转型成谁
if(a instanceof Dog){
Dog dog = (Dog) a;
dog.eat();
} else if (a instanceof Cat) {
Cat cat = (Cat)a;
cat.play();
}
}
}
2.方法的多态
重写
发生在子类上,子类重写父类的方法,方法名、参数、返回值均相同。
重写与重载
重载发生在同一个类内部,方法名相同,参数数量或参数类型必须有不同,返回类型可以相同可以不同。
1、重写(Override)
重写是子类对父类允许访问的方法进行重写, 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类
子类和父类在同一个包中,那么子类可以重写父类除了声明为 private 和 final 的方法外的所有方法
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
访问权限不能比父类中被重写的方法的访问权限更低。
父类的成员方法只能被它的子类重写,子类能够根据需要实现父类的方法
重写方法抛出的异常范围不能大于父类。异常也有继承关系,所以子类能抛出的异常不能高于父类
参数列表与被重写方法的参数列表必须完全相同。
声明为 final 的方法不能被重写。声明为 static 的方法不能被重写,但是能够被再次声明。
构造方法不能被重写。
如果不能继承一个类,则不能重写该类的方法。
2、重载(Overload)
重载是在一个类里面,方法名字必须相同,而参数必须不同。返回类型可以相同也可以不同。
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
无法以返回值类型作为重载函数的区分标准。
3、方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
方法重载是一个类中定义了多个同名的方法,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载
方法重写是在子类存在方法与父类同名的方法,而且参数的个数与类型一样,就称为重写
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。