前言:Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心。围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范、继承是类与类之间联系的一种形式、而多态为系统组件或模块之间解耦提供了解决方案(面向对象的编程语言主要有:C++、Java、C#等)。
- 面向对象的程序设计有三大特征:
封装:解决了数据的安全性问题
继承:解决了代码的重用问题
多态:解决了程序的扩展问题
- 类和对象的关系
类:
对某类事物的普遍一致性特征、功能的抽象、描述和封装,是构造对象的模版或蓝图,用 Java 编写的代码都会在某些类的内部。类之间主要有:依赖、聚合、继承等关系。
对象:
使用 new 关键字或反射技术创建的某个类的实例。同一个类的所有对象,都具有相似的数据(比如人的年龄、性别)和行为(比如人的吃饭、睡觉),但是每个对象都保存着自己独特的状态,对象状态会随着程序的运行而发生改变,需要注意状态的变化必须通过调用方法来改变,这就是封装的基本原则。
构造函数:
当此类型被new的时候会自动执行的一个方法。构造方法没有返回值类型,也不能有返回值。父类中的构造方法不能被子类继承,即便它是public的;
父类的构造方法负责初始化属于它的成员变量,而子类的构造方法则只需考虑属于自己的成员变量,不必去关注父类的情况。
This:
This引用总是指向调用成员方法的对象本身。
静态变量:
在成员变量前加static关键字,可以将其声明为静态成员变量,静态变量又叫类变量。静态变量和程序同生命周期;在没有实例化对象时,可以通过类名访问静态成员变量;也可以通过对象访问静态成员变量,但不论使用的是哪个对象,访问到的都是同一个变量;
静态成员变量在声明时最好初始化,如果不进行初始化,系统会默认初始化为0。如果类中成员变量被定义为静态,那么不论有多少个对象,静态成员变量只有一份内存拷贝,即所有对象共享该成员变量;
静态成员变量的作用域只在类内部,但其生命周期却贯穿整个程序;静态成员方法只能对类的静态成员变量进行操作;静态成员方法没有this引用。
- 封装思想:面向对象语言的精髓
核心思想就是“隐藏细节”、“数据安全”:将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。
具体的实现方式就是:
使用 private 修饰符把成员变量设置为私有,防止外部程序直接随意调用或修改成员变量,然后对外提供 public 的 set 和 get 方法按照开发者的意愿(可以编写一些业务逻辑代码,虽然很少这样做)设置和获取成员变量的值。
PS:get/set 方法;对某一个属性只提供get不提供set方法,就是只读的,在类的外部不能修改;提供统一的参数检查,在set上给与检查,判断合法性和安全性;将属性都私有,并且提供set/get 方法,做成了通用的组件,叫JavaBean;
也可以把只在本类内部使用的方法使用 private,这就是封装的思想,是面向对象最基本的开发规范之一。
Java 的访问权限修饰关键字。Java 中主要有 private、protected、public 和 默认访问权限 四种:
public 修饰符,具有最大的访问权限,可以访问任何一个在 classpath下的类、接口、异常等。
protected 修饰符,主要作用就是用来保护子类,子类和同一个包里面的类可以访问这些成员变量和方法,其余类不可以。
default 修饰符,主要是本包的类可以访问。
private 修饰符,访问权限仅限于本类内部,在我的实际项目开发过程中,大多数的成员变量都是使用 private 修饰的。
通过反射机制,还是可以访问类的私有成员的,这点在后面的框架中会涉及到。
- 继承:面向对象的主要功能
继承是一种构建新类的方式,他是基于已有的类的定义为基础,构建新的类,已有的类称为父类,新构建的类称为子类,子类能调用父类的非private修饰的成员,同时还可以自己添加一些新的成员,扩充父类,甚至重写父类已有的方法,更其表现符合子类的特征。让子类的表现更独特,更专业。继承更像一个体系,这一体系共有同一个或多个特征,而后面讲的接口,更像一个功能模块,在原有的基础上不做大规模修改重写代码,即可拥有一个新的功能(具体功能模块代码需要自己写)。
- 继承:
1.自动地共享基类中成员属性和成员方法的机制。
2.自动传播代码和重用代码的有力工具;
3.在某些比较一般的类的基础上建造、建立和扩充新类;
4.减少代码和数据的重复冗余度,并通过增强一致性来减少模块间的接口和界面,从而增强了程序的可维护性;
5.清晰地体现出类与类之间的层次结构关系。
6.继承是单方向的,即子类可以继承和访问父类中的成员,但父类则无法访问子中的成员;
7.在Java中只允许单一继承方式,即一个派生类只能继承于一个基类,而不能象C++中派生类继承于多个基类的多重继承方式(JAVA不可以同时继承多个父类,但是可以同时实现多个接口)。
8.重写在类的继承体系结构中,如果子类中出现了与父类中有同原型的方法,那么认为子类中的方法覆盖了父类中的方法(也称为方法重写);
9.通过子类的实例调用被覆盖的方法时,将总是调用子类中的方法,而父类中的方法将被隐藏。
类的实例化过程
(1)JVM 读取指定 classpath 路径下的 class 文件,加载到内存,如果有直接父类,也会加载父类;
(2)堆内存分配空间;
(3)对象属性进行默认初始化;
(4)先执行父类静态代码块、构造函数,再执行子类的静态代码块、构造函数;
- 多态
从一定的角度来看,封装和继承就是为多态来准备的。多态通俗易懂的来讲就是:父类new不同的子类然后调用一个同名的方法,由于所有子类都要覆盖此方法,所以方法的效果会有多种形态,此过程就是多态。
- 引用转型:
使用父类直接new子类。
- 多态分为静态多态和动态多态
静态多态也称为编译时多态,即在编译时决定调用哪个方法;
静态多态一般是指方法重载;
只要构成了方法重载,就可以认为形成了静态多态的条件;
静态多态与是否发生继承没有必然联系。
动态多态也称为运行时多态,即在运行时才能确定调用哪个方法;
形成动态多态必须具体以下条件:
1.必须要有继承的情况存在;
2.在继承中必须要有方法覆盖;
3.必须由父类的引用指向子类的实例,并且通过基类的引用调用被覆盖的方法;
由上述条件可以看出,继承是实现动态多态的首要前提。在有方法覆盖的前提下,并且有引用转型的情况,就将形成动态多态;
Java中的引用变量相当于C语言中的指针,它的作用是指向某个对象.比如:
Child t;
t=new Child();
t 是 一个引用变量,指向了一个Child类型的对象.内存中,你首先声明了一个Child类型的引用变量,然后你创建了一个
Child对象,并 把这个对象在堆内存中的地址赋给t,这个地址就是引用变量的值,t是引用变量的名。
****实现多态的机制:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。
****多态的表现方式:方法重载和方法重写。重载发生在方法内,重写发生在父类跟子类之间。
如有侵权,请联系我!