封装
在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
封装的优点
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量(属性/全局变量)进行更精确的控制。
- 隐藏信息,实现细节。
实现封装的步骤
- 将属性私有化。
- 提供公共的访问方法。
继承
继承是Java面向对象的核心,也是Java面向对象基石。继承允许创建分等级层次的类。
例如上图,兔子和羊属于食草动物类,狮子和豹属于食肉动物类。草动物和食肉动物又是属于动物类,这样就产生了不同的层级关系。
类的继承格式
在子类中使用extends关键字来申明该类是谁的子类。
类继承的特性
- 子类拥有父类非private的属性,方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法(重写)。
- Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。
类继承的优点
- 使代码简洁,减少代码量,提高代码的复用性。
- 提高程序的可维护性。
super/this关键字
super关键字可以在子类中对父类的属性和方法进行访问。
this 关键字指当前类本身。
注意
- 类只能单继承。
- 子类无法继承父类的构造器,如果父类中出现有参构造器,子类中必须在本类的构造器中体现。
重写/重载
重写override
重写是子类允许重新编写父类的方法实现,但是只可以重写父类的方法体,其它的不可以改变。
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重载overload
重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法都必须有一个独一无二的参数类型列表。例如有参构造器和无参构造器就是重载的一种体现。
区别:
- 重写发生在子类和父类的继承关系中,且被重写的方法只能改变方法体。
- 重载发生在本类中,无法以返回值类型不同做为重写的区分标准。
多态
多态就是同一个行为具有不同的表现形态。Java中的继承、重写、父类型引用子类型就是多态的具体表现。
父类型引用子类型
子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特。定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能(前提是,子类必须重写父类的对应的方法),又可以抽取父类的共性。
注意
使用父类型引用子类型的声明方式,无法使用子类中独有的方法。
抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的。如果一个类中没有包含足够的信息来描绘一个具体的对象,我们就可以把这样的类定义为抽象类。
抽象类除本身不能直接被实例化之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能直接被实例化,所以抽象类必须被继承,才能被使用。
抽象类的声明
语法:修饰符 abstract class 类名{}
抽象方法
在抽象类中使用abstract声明的方法就是抽象方法。
特点:
- 抽象方法没有方法体。
- 子类必须重写父类的抽象方法。
注意:
- 抽象类不可以直接实例化。
- 抽象类中可以没有抽象方法。
- 抽象方法只有方法名,没有方法体。
- 构造器无法声明为抽象方法。
- 子类必须重写父类的抽象方法,除非子类也是抽象类。
接口
接口是Java中的一种抽象类型,是抽象方法的集合。接口并不是一个类,同时接口也不可以直接实例化。
接口的声明
语法:修饰符 interface 接口名 {}
接口的实现
当类要实现接口时通过 implements 来实现接口中的方法,必须要重写接口中全部的抽象方法。
接口的继承
接口可以继承接口,使用extends关键字,同时接口允许多继承。
发生继承关系后,类在实现子接口后,必须把父接口中的抽象方法也重写。
接口与类的区别:
- 接口中的方法都是抽象方法。
- 接口没有构造器。
- 接口不可以被实例化。
- 接口中不可以有成员变量,除static、final变量。
- 接口支持多实现(也叫多继承)。
接口与抽象类的区别:
- 抽象类中可以有普通方法,接口不行。
- 接口中的成员变量只能是 public、 static、 final 类型的。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 接口中的抽象方法可以不适用abstract修饰。