面向对象
结构化程序设计和面向对象程序设计的区别
-
面向过程,以函数为中心
吃(猪八戒,西瓜)
2. ####面向对象,以对象为中心
猪八戒.吃(西瓜)
面向对象更接近自然语法。
面向对象的基本特征(缺一不可)
- 抽象
- 封装
- 继承
- 多态
JavaScript也使用了对象,但是没有继承和多态,其是基于对象。
一切皆对象(除了八个基本数据类型)
Java对象具有唯一性,如果不被引用则会被回收。
Java对象都是Object类的实例,都可调用该类的中定义的方法。
封装
隐藏对象的成员变量和实现细节,把方法暴露出来,让外部通过方法实现对成员变量的安全访问。这通过Java的访问控制符实现。
- 访问控制级别(由小到大)
- private:当前类的内部可访问
- default:同一个包内可访问
- protected:同一个包内可访问,不同包内的子类可访问(子类可重写它)
- public:全局范围可访问
- 使用原则
- 一个类就相当于一个模块,模块设计追求高内聚、低耦合
- 类的成员变量及辅助型的工具方法应用private修饰
- 希望被子类重写的方法应该用protected修饰
- 不希望被子类重写但是需要被外部类调用,可以使用final方法
- 类的构造器及希望被外部调用的方法应该用public修饰
- 尽量不要在构造器中调用将要被子类重写的方法
- Java常用包
- Java包的声明需放在非注释行的第一行,之后是imoprt语句
pacage test.dao;
import test.*;
- Java默认自动导入java.lang核心包下的所有类,比如String类,System类,Math类,Thread类
- java.util包含Java工具类/集合框架/接口类
- java.net包含Java网络编程相关的类/接口
- java.io包含IO编程相关的类/接口
- java.sql包含JDBC数据库编程的相关类/接口
- java.awt包含了构建图形界面相关的类/接口
- java.swing包含了Swing图形用户界面编程相关的类/接口
- Java包的声明需放在非注释行的第一行,之后是imoprt语句
继承
- 子类使用extends关键字继承父类。子类继承父类的成员变量和方法,也可以重写父类的方法。
- 重写遵循两同两小一大的原则,重写后父类方法被覆盖,如果想调用被覆盖的方法需要使用super关键字作为调用者。
- 特殊情况:父类的private方法不能被重写,子类只能重新定义一个相同的方法。
- 子类和父类也可以实现重载。
- 子类不能继承父类的构造器,但是可以使用super关键字调用父类的构造器。
多态
- 当Java引用变量的编译时类型和运行时类型不一致时,就可能产生多态。
- 当把一个子类对象赋给一个父类引用变量时,无需类型转换(或者说向上转型),因子类是一种特殊的父类。这时执行父类引用变量的方法时会表现出子类对象的行为。
- 当把一个父类对象赋给一个子类引用变量时,就需要进行强制类型转换。
- 为避免ClassCastException异常,强制类型转换之前应通过instanceof运算符判断。
- instanceof前一个操作数为一个引用变量,后一个操作数为一个类或者接口,用于判断前面引用变量的对象是否为后面类的实例。
public class InstanceTest {
public static void main(String[] args) {
Object obj = "astring";
String result = "";
if (obj instanceof String) {
result = (String) obj;
}
System.out.println(result);
}
}
组合
- 继承和组合都能实现类的复用,但是继承破坏了类的封装,而组合能提供更好的封装性。
- 继承表达的是is-a关系,组合表达的是has-a关系。
class Animals{
public void swing() {
System.out.println("swing arms");
}
public void swim() {
System.out.println("animals-swim");
}
}
class Birds extends Animals{
public void swim() {
System.out.println("bird cannot swim");
}
}
class Arms{
private Animals anml;
public Arms(Animals anml) {
this.anml = anml;
}
public void swing() {
anml.swing();
}
public void swim() {
System.out.println("no swim");
}
}
public class Test {
public static void main(String[] args) {
Animals animals = new Animals();
animals.swing();
animals.swim();
Birds birds = new Birds();
birds.swing();
birds.swim();
Arms arms = new Arms(animals);
arms.swing();
arms.swim();
}
}
不为当下而战,何以颠覆未来