封装性
封装就是隐藏对象的属性和实现细节,仅提供公共访问方式来让外界访问。
在Java语言中,访问修饰符分为四类:private,默认(什么也不加),protected,public。
private:
Person类中用private修饰的成员变量,只能在Person类中使用,且只能由我们决定外界是否能访问它。如果我们想要外界访问它,只能提供公开访问的方法让外界可以去访问,这里我们给私有属性name提供setName和getName方法,外界就可以通过setName方法对私有属性name的值进行修改,且能使用getName方法去获得name的值。
默认:
使用默认访问限定符修饰的成员变量或方法是不能在不同包的类中访问的,同一包中的所有类可访问。
public(公共):
用public访问限定符修饰的成员变量或方法不管是在不同类还是不同包都可以访问,处处可修改并获取。
protected:
被protected修饰的成员对于本包和其子类可见。
继承性
子类继承(extends)父类(共性的抽取)的方式去实现代码的复用。
子类无法访问父类中用private修饰成员变量,父类中用private修饰的成员变量是会被子类继承的,但是不能直接访问,只能通过公共访问的成员方法对其进行访问。
当父类成员变量与子类成员变量出现同名冲突时,优先访问子类的成员变量。
那我们就想访问父类中的同名成员变量呢?这时候就得用到super这个关键字(注:其不是父类的引用,只是个关键字,用于更直观地理解代码),使用super. 成员变量名访问父类中同名的成员变量,super.成员方法名()访问父类中同名的成员方法。
每个类编译器都会生成一份默认无参的构造方法(但是不会显示出来),但是当我提供了任意的构造方法后,那编译器提供的默认无参的构造方法就不会生成。
子类会默认帮助父类进行初始化。当我给父类自定义构造方法时,父类默认无参构造方法不存在,那子类就无法默认帮父类进行无参构造,所以才会编译失败。这里我们还是使用super(...)调用父类的构造方法帮助父类构造。(帮助父类的成员变量进行初始化)。而且子类帮助父类进行构造只能在子类构造方法的第一行。
当你不想某个类被继承时,可以加final修饰。(修饰变量时变量无法更改,修饰方法时,方法不能重写)。
Java中只允许单继承,不能多继承。
支持多层继承:
多态性
多态是同一个行为具有不同的表现方式或形态。
在继承的基础上,重写父类中的成员方法并定义父类引用指向子类对象(向上转型:不用进行强制转换,可以调用父类中所有成员,但是不能调用子类中特有成员)。
向下转型:
如果父类引用对象是父类本身,进行向下转型时,即使 使用强制类型转换后,也只能保证编译不出错,运行时还是会报无法进行强制类型转换的错误。此时不安全。
只有当父类引用指向子类对象,再进行向下转型时,才是安全的。