Java面向对象的3个基本特征

编程是思想,是用抽象的方法解决科学的问题。

面向对象

目的:

  • 代码重用
  • 接口重用

封装


封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据,数据操作,方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

  • 问题域中该有哪些类,哪些对象
  • 每个类,每个对象中该具有什么属性,什么方法,什么参数
  • 类与类之间是什么关系
  • 封装类的考虑:名词
  • 定义属性的考虑:不脱离具体的应用环境(不建议直接访问某各类中的属性,可以定义为privete)
  • 方法的封装:站在主语的角度看待问题,描述问题和解决问题
  • 如通过set/get对类的属性进行操作,降低耦合对
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class DataBean {
	private int year;
	private int month;
	private int day;

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		this.month = month;
	}

	public int getDay() {
		return day;
	}

	public void setDay(int day) {
		this.day = day;
	}
}

Java的四种访问控制符

  • default:默认的,在同一包内可见,不使用任何修饰符。
  • private:私有的,在同一类内可见。
  • public:共有的,对所有类可见。
  • protected:受保护的,对同一包内的类和所有子类可见。

继承


它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//基类、父类、超类
public class Animal {

	public void eat() {
	}

    public void sleep() {
	}
}
//“子类、派生类
public class Dog extends Animal {

    public void go(){
    }

    @Override
    public void eat(){
        
    }
}

继承的3种实现方式

  • 实现继承是指使用基类的属性和方法而无需额外编码的能力;
  • 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
  • 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

多态


所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口

多态的3个特征

  • 有继承,实现接口类是继承的一种
  • 有重写,重写父类(抽象类)中的方法
  • 有父类的引用指向子类的对象

抽象类与接口类的选择

  • 没有具体事物作为参考对象,或者事物种类繁多就设计为抽象类
  • 如果考虑一类事物或者几类事物之间的共同特征和相同属性,就设计为接口类

抽象类详解:

  • 含有抽象方法的类必须是抽象类,抽象类必须被继承,抽象方法必须被重写,或则重新声明定义,或则将子类也定义成抽象类
  • 抽象类不能被实例化,也就是不能创建对象
  • abstract 抽象方法:只需要声明也不需要实现
  • 子类重写实现抽象方法(抽象方法一定要被重写,或者再定义声明一遍)

多态的优点

  • 每个Java类只能单继承(类/抽象类)多实现(接口)
  • 可扩展性(Extensibility)
  • 多个无关的类可以实现同一个接口
  • 一个类可以实现多个无关的接口

重载与重写

  • 方法重载(overload)实现的是编译时的多态性(也称为前绑定)
  • 方法重写(override)实现的是运行时的多态性(也称为后绑定)。
  • 覆盖(重写),是指子类重新定义父类的虚函数的做法。
  • 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 历
public interface Almanac{
    public String getDate();
}
// 农历
public class LunarImpl implements Almanac{
    @Override
	public String getDate() {
		return TimeUtil.dateFormat(calendar, "yyyy年MM月dd日");
	}
}
// 伊斯兰历
public class IslamicImpl implements Almanac{
    @Override
	public String getDate() {
		return getIslamicYear() + "年" + getIslamicMonth() + "月" + getIslamicDay() + "日";
	}
}
public class Main{

    private static void printDate(Almanac almanac){
        System.out.println(almanac.getDate());
    }

    public static void main(String[] args) {
        printDate(new IslamicImpl());
        // 或者
        printDate(new LunarImpl());
    }
}

参考文档

面向对象的三个基本特征 和 五种设计原则
Java面向对象的三个特征与含义