面向对象

Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心。围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范、继承是类与类之间联系的一种形式、而多态为系统组件或模块之间解耦提供了解决方案。

1. 面向对象的特点

(1)面向对象是一种常见的思想,比较符合人们的思考习惯;
			
	(2)面向对象可以将复杂的业务逻辑简单化,增强代码复用性;
	
	(3)面向对象具有抽象、封装、继承、多态等特性。

  		面向对象的编程语言主要有:C++、Java、C#等。

2.类和对象之间的关系

类是对某类事物的普遍一致性特征、功能的抽象、描述和封装,
是构造对象的模版或蓝图。
用 Java 编写的代码都会在某些类的内部。类之间主要有:依赖、聚合、继承等关系。
对象
使用 new 关键字或反射技术创建的某个类的实例。
同一个类的所有对象,都具有相似的数据(比如人的年龄、性别)
和行为(比如人的吃饭、睡觉),但是每个对象都保存着自己独特的状态,
对象状态会随着程序的运行而发生改变,
需要注意状态的变化必须通过调用方法来改变,这就是封装的基本原则。

三大特征之封装

封装思想
核心思想就是“隐藏细节”、“数据安全”:将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。

具体实现
通过将修饰符改为private,防止外部程序直接调用或者修改变量,并且提供公共的get和set方法供外部使用。有一个Java的jar包,不需要你去编写get和set方法,就是Lombok.jar,它会自动生成所有属性的get和set方法。

Java访问权限修饰符
public 修饰符,具有最大的访问权限,
可以访问任何一个在 CLASSPATH 下的类、接口、异常等。
protected 修饰符,主要作用就是用来保护子类,
子类可以访问这些成员变量和方法,其余类不可以。
default 修饰符,主要是本包的类可以访问。
private 修饰符,访问权限仅限于本类内部,
 在实际开发过程中,大多数的成员变量和方法都是使用 private 修饰的。

本类内部

本包

子类

外部包

public

可以

可以

可以

可以

protected

可以

可以

可以

不可以

default

可以

可以

不可以

不可以

private

可以

不可以

不可以

不可以

Java 的访问控制是停留在编译层的,只在编译时进行访问权限检查,
不会在类文件中留下痕迹。

通过反射机制,还是可以访问类的私有成员的。

三大特征之继承

(1)在多个不同的类中抽取出共性的数据和逻辑,对这些共性的内容进行封装一个新的类即父类(也叫做超类或基类),让之前的类来继承这个类,那些共性的内容在子类中就不必重复定义,比如 BaseDAO、BaseAction 等。

(2)Java 的继承机制是单继承,即一个类只能有一个直接父类。

(3)如果子类和父类有同名成员变量和方法,子类可以使用 super 关键字调用父类的成员变量和方法,上述使用方式前提是成员在子类可见。

(4)在调用子类构造方法时,会隐式的调用父类的构造方法 super()。如果父类没有无参构造方法,为了避免编译错误,需要在子类构造方法中显式的调用父类的含参构造方法。

(5)子类创建时调用父类构造方法:子类需要使用父类的成员变量和方法,所以就要调用父类构造方法来初始化,之后再进行子类成员变量和方法的初始化。因此,构造方法是无法覆盖的。

(6)当子类需要扩展父类的某个方法时,可以覆盖父类方法,但是子类方法访问权限必须大于或等于父类权限。

(7)继承提高了程序的复用性、扩展性,也是 Java 语言多态特征的前提。

(8)在实际开发、程序设计过程中,并非先有的父类,而是先有了子类中通用的数据和逻辑,然后再抽取封装出来的父类。

类的实例化过程
1)JVM 读取指定 classpath 路径下的 class 文件,加载到内存,如果有直接父类,也会加载父类;

  (2)堆内存分配空间;

  (3)执行父类、子类静态代码块;

  (4)对象属性进行默认初始化;

  (5)调用构造方法;

  (6)在构造方法中,先调用父类构造方法初始化父类数据;

  (7)初始化父类数据后,显示初始化,执行子类的构造代码块;

  (8)再进行子类构造方法的特定初始化;

  (9)初始化完毕后,将地址赋值给引用
1 /*
  2     父类
  3 */
  4 class Parent {
  5 
  6     int num = 5;
  7 
  8     static {
  9         System.out.println("父类静态代码块");
 10         System.out.println();
 11     }
 12 
 13     {
 14         System.out.println("父类构造代码块1," + num);
 15         num = 1;
 16         System.out.println("父类构造代码块2," + num);
 17         doSomething();
 18         System.out.println();
 19     }
 20 
 21     Parent() {
 22         System.out.println("父类构造方法1," + num);
 23         num = 2;
 24         System.out.println("父类构造方法2," + num);
 25         doSomething();
 26         System.out.println();
 27     }
 28 
 29     void doSomething() {
 30         System.out.println("父类doSomething方法1," + num);
 31         num = 3;
 32         System.out.println("父类doSomething方法2," + num);
 33         System.out.println();
 34     }
 35 }
 36 
 37 /*
 38     子类
 39 */
 40 class Child extends Parent {
 41 
 42     int num = 10;
 43     
 44     /*
 45         静态代码块,在类加载时执行
 46     */
 47     static {
 48         System.out.println("子类静态代码块");
 49         System.out.println();
 50     }
 51 
 52     /*
 53         构造代码块
 54     */
 55     {
 56         System.out.println("子类构造代码块1," + num);
 57         num = 11;
 58         System.out.println("子类构造代码块2," + num);
 59         doSomething();
 60         System.out.println();
 61     }
 62 
 63     Child() {
 64         System.out.println("子类构造方法1," + num);
 65         num = 12;
 66         System.out.println("子类构造方法2," + num);
 67         doSomething();
 68         System.out.println();
 69     }
 70 
 71     void doSomething() {
 72         System.out.println("子类doSomething方法1," + num);
 73         num = 13;
 74         System.out.println("子类doSomething方法2," + num);
 75         System.out.println();
 76     }
 77 
 78 }
 79 
 80 public class A {
 81     public static void main(String[] args) {
 82         Child child = new Child();
 83         child.num = 20;
 84         child.doSomething();
 85     }
 86 }
 87 
 88 输出:
 89 
 90 父类静态代码块
 91 
 92 子类静态代码块
 93 
 94 父类构造代码块1,5
 95 父类构造代码块2,1
 96 子类doSomething方法1,0
 97 子类doSomething方法2,13
 98 
 99 
100 父类构造方法1,1
101 父类构造方法2,2
102 子类doSomething方法1,13
103 子类doSomething方法2,13
104 
105 
106 子类构造代码块1,10
107 子类构造代码块2,11
108 子类doSomething方法1,11
109 子类doSomething方法2,13
110 
111 
112 子类构造方法1,13
113 子类构造方法2,12
114 子类doSomething方法1,12
115 子类doSomething方法2,13
116 
117 
118 子类doSomething方法1,20
119 子类doSomething方法2,13

Java三大特征之多态

多态指允许不同类的对象对同一“消息”做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。可以用于消除类型之间的耦合关系,Spring 的核心就是多态和面向接口编程。
Java 中可以使用父类、接口变量引用子类、实现类对象;
在这个过程中,会对子类、实现类对象做自动类型提升,其特有功能就无法访问了,如果需要使用,可以做强制类型转换。