面向对象

结构化程序设计和面向对象程序设计的区别

  1. 面向过程,以函数为中心

吃(猪八戒,西瓜)
2. ####面向对象,以对象为中心
猪八戒.吃(西瓜)
面向对象更接近自然语法。

面向对象的基本特征(缺一不可)

  • 抽象
  • 封装
  • 继承
  • 多态
    JavaScript也使用了对象,但是没有继承和多态,其是基于对象。

一切皆对象(除了八个基本数据类型)

Java对象具有唯一性,如果不被引用则会被回收。
Java对象都是Object类的实例,都可调用该类的中定义的方法。

封装

隐藏对象的成员变量和实现细节,把方法暴露出来,让外部通过方法实现对成员变量的安全访问。这通过Java的访问控制符实现。

  1. 访问控制级别(由小到大)
    • private:当前类的内部可访问
    • default:同一个包内可访问
    • protected:同一个包内可访问,不同包内的子类可访问(子类可重写它)
    • public:全局范围可访问
  2. 使用原则
    • 一个类就相当于一个模块,模块设计追求高内聚、低耦合
    • 类的成员变量及辅助型的工具方法应用private修饰
    • 希望被子类重写的方法应该用protected修饰
    • 不希望被子类重写但是需要被外部类调用,可以使用final方法
    • 类的构造器及希望被外部调用的方法应该用public修饰
    • 尽量不要在构造器中调用将要被子类重写的方法
  3. 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图形用户界面编程相关的类/接口

继承

  1. 子类使用extends关键字继承父类。子类继承父类的成员变量和方法,也可以重写父类的方法。
  2. 重写遵循两同两小一大的原则,重写后父类方法被覆盖,如果想调用被覆盖的方法需要使用super关键字作为调用者。
  3. 特殊情况:父类的private方法不能被重写,子类只能重新定义一个相同的方法。
  4. 子类和父类也可以实现重载。
  5. 子类不能继承父类的构造器,但是可以使用super关键字调用父类的构造器。

多态

  1. 当Java引用变量的编译时类型和运行时类型不一致时,就可能产生多态。
  2. 当把一个子类对象赋给一个父类引用变量时,无需类型转换(或者说向上转型),因子类是一种特殊的父类。这时执行父类引用变量的方法时会表现出子类对象的行为。
  3. 当把一个父类对象赋给一个子类引用变量时,就需要进行强制类型转换。
  4. 为避免ClassCastException异常,强制类型转换之前应通过instanceof运算符判断。
  5. 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);
	}
}

组合

  1. 继承和组合都能实现类的复用,但是继承破坏了类的封装,而组合能提供更好的封装性。
  2. 继承表达的是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();
	}
}
原文地址:https://www.cnblogs.com/pycrab/p/8729140.html