面向对象编程
- 万物皆对象。
- 面向对象指以属性和行为的观点去分析现实生活中的事物。
- 面向对象编程指先以面向对象的思想进行分析,然后使用面向对象的编程语言进行表达的过程
- 面向对象编程是软件产业化发展的需求。
- 理解面向对象的思想精髓(封装,继承,多态),至少掌握一种编程语言
类和对象的概念
- 对象主要指现实生活中客观存在的实体,在java语言中对象体现为内存空间中的一块存储单元区域
- 类就是“分类”,是对具体相同特征和行为的多个对象共性的抽象描述,在java语言中体现为一种引用数据类型,里面包含了描述特征/属性的成员变量以及描述行为的成员方法。
- 类是构建对象的模板,对象的数据结构由定义它的类来决定。
类的定义
- class 类名{
类体
};
定义类的代码存储在方法区。 - 注意:当类名由多个单词组成时,每个单词首字母都 需要大写
成员变量的定义
- class 类名{
数据类型 成员变量名 = 初始值;
} - 注意:当成员变量由多个单词组成时,通常要求从第二个单词起每个单词的首字母大写
对象的创建
- new 类名(); // new Person();
- 注意:
- 当一个类定义完毕后,可以使用new关键字来创建该类的对象,这个过程叫做类的实例化
- 创建对象的本质就是在内存空间内的堆区申请一块存储区域,用于存放该对象独有特征信息。
- 对象创建后,其成员变量可以按照默认的方式初始化,具体规则如下:
数值类型默认值为0;引用类型默认值为null;boolean类型默认值为false
引用定义
- 基本概念
- 使用引用数据类型定义的变量叫做引用型变量,简称为“引用”
- 引用变量主要用于记录对象在堆区的内存地址信息,便于下次访问
- 语法格式
类名 引用变量名;
引用变量名.成员变量名;
成员方法的定义
- class 类名{
返回值类型 成员方法名(形参列表){
成员方法体;
、 }
} - 当成员方法由多个单词组成时,要求从第二个单词起每个单词的首字母大写
返回值详解
- 返回值是将方法体内返回到方法体外的数据类型
- 返回值类型主要指返回值的数据类型,可以是基本数据类型也可以是引用数据类型
- 例如当返回的数据为66时,则返回指类型写int即可
- 在方法体中使用return关键字可以返回具体的数据内容并结束当前方法
- 当返回的数据内容是66时,则方法体写return 66;即可
- 当该方法不需要返回值时,返回类型写void即可
形参类型详解
- 形式参数主要用于将方法体外的数据内容带入到方法体内部
- 形式参数列表主要指多个形式参数组成的列表,语法格式如下:
数据类型 形式变量1,数据类型 形式参数2,… - 当 带入的数据内容时“hello”时,则形参列表写String s 即可
- 当带入的数据内容是66和“hello”时,则形参列表写int i,String s即可
- 若该方法不需要传入任何的数据,括号内什么也不写即可
方法体详解
- 成员方法体主要用于编写描述该方法功能的语句
- 成员方法可以实现代码的 重用,简化代码
方法的调用
- 引用变量名.成员方法名(实参列表);
- 实际参数列表主要用于对形式参数列表进行初始化操作,因此参数的个数,类型以及顺序都要完全一致。
- 实际参数可以传递直接量,变量,表达式,方法的调用等。
可变长参数
- 返回值类型 方法名(参数的类型… 参数名)
- 方法参数部分指定类型的参数个数是可以改变的,也就是0~n个
- 一个方法的形参列表中最多中声明一个可变长形参,并且需要放到参数列表的末尾
方法的传参过程
- int max(int a,int b)}{… … …} int a = 5;int b = ; int res = m.max(a,b);
- 为main方法中的变量a,b,res分配空间并初始化
- 调用max方法,为max方法的形参变量分配空间
- 将实参变量的数值赋值到形参变量的内存空间中
- max方法运行完毕后返回,形参变量的空间释放
- main方法中的res变量得到max方法的返回值
- main方法结束后释放相关变量的内存空间
参数传递的注意事项
- 当基本数据类型的变量作为方法的参数传递时,形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间
- 引用数据类型的变量作为方法的参数传递时,形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变量指向同一块内存空间
- 当引用数据类型的变量作为方法的参数传递时,若形参变量改变指向后再改变指定的内容,则通常不会影响到实参变量指向内容的改变,因为两个变量指向不同的内存空间。
内存结构之栈区
- 栈用于存放程序运行过程当中所有的局部变量。一个运行的java程序从开始到结束会有多次方法的调用
- JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数,局部变量等数据。
- 当某一个方法调用完成后,其对应的栈帧将被清除
构造方法
- class 类名{
…类名(形参列表){
… …构造方法体;
…}
} - 构造方法名与类名完全相同并且没有返回值类型,连void都不许有
默认构造方法
- 当一个类中没有定义任何构造方法时,编译器会自动添加一个无参空构造方法,叫做默认/缺省构造方法,如:Person(){};
- 若类中出现了构造方法,则编译器不再提供任何形式的构造方法
构造方法的作用
- 使用new关键字创建对象时会自动调用构造方法实现成员变量初始化工作
方法的重载
- 若方法名称相同,参数列表不同,这样的方法之间构成的重载关系(overload)
- 方法重载的主要形式体现在:参数的个数不同,参数的类型不同,参数的顺序不同,与返回值类型和形参变量名无关,但建议返回值类型最好相同。
- 判断方法能否构成重载的核心:调用方法时能否加以区分。
重载的实际意义
- 方法重载的实际意义在于调用者只需要记住一个方法名就可以调用各种不同的版本,来实现各种不同的功能。
- 如:java.io.PrintStream类中的println方法
this关键字的基本概念
- 如果再构造方法中出现了this关键字,则代表当前正在构造的对象
- 如果在成员方法中出现了this关键字,则代表当前正在调用的对象
- this关键字本质上就是当前类类型的引用变量
this的工作原理
- 在构造方法中和成员方法中访问成员变量时,编译器会加上this.的前缀,而this.相当于汉语中的“我的”。当不同的对象调用同一个方法时,由于调用方法的对象不同导致this关键字不同,而从this.方式访问的结果也就随之不同了。
this的使用方式
- 当局部变量名与成员变量名相同时,在方法体中会优先使用局部变量(就近原则),若希望使用成员变量,则需要在成员变量的前面加上this.的前缀,明确要求该变量是成员变量。
- this关键字出来可以通过this.的方式调用成员变量和成员方法外,还可以作为方法的返回值
- 在构造方法的第一行可以使用this.的方式来调用本类中的其他构造方法
注意事项
- 引用类型变量用于存放对象的地址,可以给引用类型赋值为null,表示不指向任何对象
- 当某个引用类型变量为null时无法对对象实施访问(因为它没有指向任何对象)。此时,如果通过引用访问成员变量或者调用方法,会产生NullPointerException异常。
递归的基本概念
- 递归本质就是指在方法体的内部直接或间接调用当前方法自身的形式
注意事项
- 使用递归必须有递归的规律以及退出条件
- 使用递归必须使得问题简单化而不是复杂化
- 若递归影响到程序的执行性能,则使用递推取代之
封装的概念
- 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生活不符。
- 为了避免上述错误的发生,就需要对成员变量进行密封包装处理,来隐藏成员变量的细节以及保证成员变量数值的合理性,该机制就叫封装。
封装的实现流程
- 私有化成员变量,使用private关键字修饰
- 提供共有的get和set方法,并在方法体中进行合理值的判断
JavaBean的概念
- JavaBean是一种Java语言写成的可重用组件,其他Java类可以通过反射机制发现和操作这些JavaBean的属性
- JavaBean本质上就是符合以下标准的类
- 类是公共的
- 有一个无参的公共构造器
- 有属性,且有对应的get,set方法
static关键字
- 使用static关键字修饰成员变量表示静态的含义,此时成员变量由对象层提升为类层级,也就是整个类只有一份并被所有对象共享,该成员变量随着类的加载准备就绪,与是否创建对象无关。
- static关键字修饰的成员可以使用引用.的方式访问,但推荐类名.的方式访问。
使用方法
- 非静态成员方法中既能访问非静态的成员又能访问非静态的成员。(成员:成员变量+成员方法,静态成员被所有对象共享)
- 静态成员方法中只能访问静态成员不能访问非静态成员。(成员:成员变量+成员方法,因为此时可能还没有创建对象)
- 在以后的开发中,只有隶属于类层级并被所有对象共享的内容才可以使用static关键字修饰(不能滥用)。
构造块和静态代码块
- 构造块:在类体中直接{}括起来的代码块
(当需要在执行构造方法体之前做一些准备工作时,则将准备工作的相关代码写在构造块中即可,比如:对成员变量进行统一的初始化操作) - 每创建一个对象都会执行一次构造块
- 静态代码块:使用static关键字修饰的构造块
(当需要在执行代码块之前随着类的加载做一些准备工作时,则编写代码到静态代码块中,比如:加载数据库的驱动包等) - 静态代码块随着类的加载时执行一次
考点
- 先执行父类的静态代码块,再执行子类的静态代码块
- 执行父类的构造块,在线父类的构造方法体
- 执行子类的构造器,执行子类的构造方法体
main方法
- 语法格式:public static void main(String[] args){}
- main方法的参数传递 – 用java 命令运行字节码文件时直接将实参跟在后面
单例设计模式
- 在某些特殊场合中,一个类对外提供且只提供一个对象,这样的类叫做单例类,而设计单例的流程和思想叫做单例设计模式。
单例设计模式的实现流程
- 私有化构造方法,使用private关键字修饰
- 声明本类类型的引用指向本类类型的对象,并使用private static关键字共同修饰
- 提供共有的get方法负责将对象返回出去,并使用public static关键字共同修饰
单例设计模式的实现方式
- 单例设计模式的实现方式有两种:饿汉式和懒汉式,在以后的开发中推荐饿汉式。
饿汉式
public class Singleton{
//私有化构造方法
private Singleton(){}
//声明本类类型的引用指向本类类型的对象,使用private和static共同修饰
private static Singleton sin = new Singleton(); //饿汉式
//使用public,static共同修饰
public static Singleton getInstance(){
return sin;
}
}
懒汉式
public class Singleton{
//私有化构造方法
private Singleton(){}
//声明本类类型的引用指向本类类型的对象,使用private和static共同修饰
private static Singleton sin = null; //懒汉式
//使用public,static共同修饰
public static Singleton getInstance(){
if(null == sin){
sin = new Singleton(); //返回时才new一个对象
}
return sin;
}
}
继承
- 当多个类之间有相同的特征和行为时,可以将相同的内容提取出来组成一个公共类,让多个类吸收公共类已有特征和行为而在多个类型只需要编写自己独有特征和行为的机制,叫做继承。
- 在java语言中使用extends(扩展)关键字来表示继承关系
- 如:
public class Worker extends Person{} - 表示Worker类继承自Person类
其中Person类叫做超类,父类,基类
其中Worker类叫做派生类,子类,孩子类 - 使用继承提高看代码的复用性,可维护性及扩展性,是多态的前提条件。
继承的特点
- 子类不能继承父类的构造方法和私有方法,但私有成员变量可以被继承只是不能被访问。
- 无论使用何种构造子类的对象时都会自动调用父类的无参构造方法,来初始化从父类中继承的成员变量,相当于在构造方法的第一行增加了super()的效果。
- 使用继承必须满足逻辑关系:子类 is a 父类,也就是不能滥用继承
- Java 语言中只支持单继承,不支持多继承,也就是说一个子类只能有一个父类,但一个父类可以有多个子类。
方法重写
概念
- 从父类中继承下来的方法不满足子类的需求时,就需要在子类中重新写一个和父类一样的方法来覆盖从父类中继承下来的版本,该方式就叫做方法的重写(Override)。
原则
- 要求方法名相同,参数列表相同以及返回值相同,从Java5开始允许返回子类类型。
- 要求方法的访问权限不能变小,可以相同,也可以变大。
- 要求方法不能抛出更大的异常(异常机制)
访问控制符
注意事项
- public修饰的成员可以在任意位置使用
- private 修饰的成员只能本类内部使用
- 通常情况下,成员方法都使用public关键字修饰,成员变量都使用private关键字修饰
package
package的由来
- 定义类时需要指定类的名称,但如果仅仅将类名作为类的唯一标识,则不可避免的出现命名冲突的问题。这会给组件复用以及团队间的合作造成很大的麻烦!
- 在java语言中,用包(package)的概念来解决命名冲突的问题。
包的定义
- 在定义一个类时,除了定义类的名称一般还要指定一个包名,格式如下:
package 包名;
package 包名1.包名2.包名3…包名n - 为了实现项目管理,解决命名冲突以及权限控制的效果。
定义包的规范
- 如果各个公司或开发组织的程序员都随心所欲的命名包名的话,仍然不能从根本上解决命名冲突的问题。因此,在指定包名的时候应按照一定的规范。
- org.apache.commons.lang.StringsUtil
期中StringsUtil是类名,org.apache.commons.lang是多层包名,其含义如下: org.apache表示公司或者组织的信息(是这个公司域名的反写);common表示项目的名称信息;lang表示模块的名称信息
包的导入
- 使用import关键字导入包
- 使用import关键字导入静态成员,从Java5.0开始
final的基本概念
- final本意为“最终的,不可改变的”,可以修饰类,成员方法以及成员变量
使用方式
- final关键字修饰类体现该类不能被继承
主要用于防止滥用继承,如:java.lang.String - final关键字修饰成员方法体现在该方法不能被重写但可以被继承
主要用于防止不经意间造成重写,如:java.text.Dateformat类中的format方法等 - final关键字修饰成员变量体现该变量必须初始化且不能改变。
主要用于防止不经意间造成改变,如:java.lang.Thread类中MAX_PRIORITY等
常量的概念
- 在以后的开发中很少单独使用final关键字来修饰成员变量,通常使用public static final关键字共同修饰成员变量来表达常量的含义。常量的命名规范要求是所有字母都要大写,不同的单词之间采用下划线连。
- public static final double PI = 3.14;