一、面对对象编程
面向对象指以属性和行为的观点去分析现实生活中的事物
面向对象编程指以面向对象的思想进行分析,然后使用面向对象的编程语言进行表达
二、类
类即“分类”,是对具有相同特征的行为的多个对象共性的抽象描述。
java中体现为一种引用数据类型,包含成员变量(特征/属性)以及成员方法(行为)
三、对象
对象是指现实生活中客观存在的实体,Java中体现为内存空间中的一块存储区域
四、类和对象
类用于构建对象,对象的数据结构由定义它的类决定;两者关系如 汽车(类) - 奔驰(对象)
1.格式
class 类名 { 类体; }
注意:约定单类名由多个单词组成时,要求每个单词首字母都要大写
2.类的实例化(又叫对象的创建)
格式:new 类名();
本质是在内存空间的堆区中申请一块存储区域,存放该对象独有特征信息
3.引用
概念
类实例化后,在内存中申请了一块内存空间,需要一个变量来保存内存空间的地址,方便进行访问,故引出引用数据类型的概念。使用引用数据类型定义的变量叫引用型变量,简称引用,用于记录对象在堆区中的内存地址信息,便于下次访问。
格式
类名 引用变量名; (类名 引用变量名 = new 类名();)
引用变量名.成员变量名
注意
引用类型变量存放对象的地址,可以给引用类型赋值为null,表示不指向任何对象
4.类的组成
A.构造方法
1.格式
类名(形参列表){
构造方法体;
}
构造方法名与类名完全相同并且没有返回值类型,连void都不许有
2.默认/缺省构造方法
当一个类中没有定义构造方法是,编译器会自动添加一个无参空构造方法,称为默认/缺省构造方法,若出现了构造方法,则编译器不再提供任何形式的构造方法。
3.作用
使用new关键字创建对象时,会自动调用构造方法实现成员变量的初始化工作
4.注意
构造方法不能通过引用.的方式进行调用
B.成员变量
1.格式
calss 类名 {
数据类型 成员变量名 = 初始值;
}
当成员变量名由多个单词组成时,通常要求从第二个单词起每个单词的首字母大写
2.初始值
对象创建后,成员变量未声明初始值的话,java会按默认值对其初始化
- 数值类型byte、short、int、long、float、double、char 默认初始值为0,char默认值是指ASCII码为0,打印出来是空字符
- boolean型 默认初始值为false
- 引用类型 null
C.成员方法
1.格式
class 类名 {
返回值类型 成员方法名(形参列表) {
成员方法体;
}
}
注意:当成员方法名由多个单词组成时,通常要求从第二个单词起每个单词的首字母大写
2.组成
返回值
作用:返回值指从方法体内返回到方法体外的数据内容
返回值具有类型
- 有返回值:通过return关键字返回数据并结束方法体,可以是基本数据类型,也可以是引用数据类型
- 无返回值:方法不需要返回任何数据内容时,返回值类型为 void
形式参数
作用:形式参数用于将方法体外的数据内容带入方法体内
格式:数据类型 形参变量名1, 数据类型 形参变量名2, …
可变长参数
格式:返回值类型 方法名 (参数的类型… 参数名)
注意:
1.方法参数部分指定类型的参数个数是可以改变的,也就是0~n个
2.一个方法的形参列表中最多只能声明一个可变长形参,并且需要放到参数列表的末尾
方法体
用于编写描述该方法功能的语句块,可以实现代码的重用,简化代码
3.调用
格式: 引用变量名. 成员方法名(实参列表);
实际参数列表主要用与对形式参数进行初始化操作,所以实参的个数、类型和顺序要和形参的完全一致
实际参数可以传递直接量、变量、表达式、方法的调用等
4.参数传递
相关概念
- 参数分为形参和实参,定义方法时的参数叫形参,调用方法时传递的参数叫实参
- 值传递:当参数为基本类型时,此时是值传递,直接把数值赋值给了形参
- 引用传递:当参数为引用类型时,此时是引用传递,把对象的地址赋值给形参
方法的传参过程
基本数据类型传参
形参变量数值的改变通常不会影响到实参变量的数值,因为两个变量有各自独立的内存空间
引用数据类型传参
形参变量指向内容的改变会影响到实参变量指向内容的数值,因为两个变量指向同一块内存空间
D.构造块
1.概念
在类体中直接使用 {} 括起来的代码块
2. 执行
每创建一个对象都会执行一次构造块,且会在构造方法之前执行
3.作用
当需要在执行构造方法体之前做一些准备工作时,则将准备工作的相关代码写在构造体中即可,比如:对成员变量进行统一的初始化操作
E.静态代码块
1.概念
使用static关键字修饰的构造块
2. 执行
静态代码块随着类的加载是执行一次
3.作用
当需要在执行代码块之前随着类的加载做一些准备工作时,则编写代码到静态代码块中,比如:加载数据库的驱动包等
F.内部类
见后面特殊类
5.this关键字
区别
构造方法中的this关键字代表当前正在构造的对象
成员 方法中的this关键字代表正在调用此方法的对象
本质
this关键字的本质就是当前类类型的引用变量
原理
在构造方法和成员方法中访问成员变量时,编译器会默认加上this.的前缀
使用方式
- 当局部变量名和成员变量名相同时,在方法中需对成员变量名的前面加上this.的前缀,明确要求该变量是成员变量
- 通过this.的方式调用成员变量和成员方法
- this可以作为方法的返回值
- 在构造方法的第一行可以使用this()的方式调用本类中的其他构造方法
6.static关键字
基本概念
- static表示静态的含义,可以修饰成员变量和成员方法,此时可以使用引用.的方式访问,但推荐用类名.的方式
- static修饰成员变量时,此时成员变量由对象层级提升为类层级,该成员变量随着类的加载准备就绪,整个类只有一份并被所有对象共享,与是否创建对象无关
- 被static修饰的成员变量叫静态成员变量,被修饰的方法叫静态成员方法
使用方式
- 在非静态方法中既能访问非静态的成员又能访问静态的成员 (静态成员被所有对象共享)
- 在静态方法中只能访问静态成员不能访问非静态成员( 因为此时可能还没有创建对象)
- 严格遵循只有隶属类层级并被所有对象共享的内容才可以使用static关键字修饰(不能滥用static关键字)
7.代码块和静态代码块的执行等级
- 同一个类中
先执行静态代码块,再执行构造块,最后执行构造方法体
- 继承关系的类中
1.先执行父类的静态代码块,再执行子类的静态代码块
2.执行父类的构造块,再执行父类的构造方法体
3.执行子类的构造块,再执行父类的构造方法体
大致理解
1.父类.class先于子类.class文件读入内存,故父类的静态代码块先于子类的静态代码块执行
2.创建子类对象时,会先构造父类,用来初始化继承下来的父类成员变量
3.又创建对象时会执行构造块和构造方法,故先执行父类的构造块和构造方法体,再执行子类
8.程序的执行流程和内存分析
栈区
- 栈用于存放程序运行过程当中所有的局部变量。一个运行的Java程序从开始到结束会有多次方法的调用
- JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据
- 当某一个方法调用完成后,其对应的栈帧将被清除
程序分析
1.执行程序时,先将代码从硬盘加载到内存中的方法区中
2.执行main方法,此时在栈区为main方法申请一段内存,保存方法中的局部变量等
3.执行new Person()时,在堆区申请空间,保存Person的成员变量等,将内存地址赋值给引用变量p
五、其他相关
1. main方法参数
main方法传参时,通过在dos命令窗口使用 java xxxx 调用时通过空格隔开各参数值 例如 java Test 张三 李四 王五 其中传入3个参数,第一个参数为张三 第二个参数为李四 第三个参数为王五
2. 访问控制
常用的访问控制符
注意
- public修饰的成员可以在任意位置使用
- private修饰的成员只能在本类内部使用
- 通常,成员方法都用public修饰,成员变量都用private修饰
3.package关键字
出现原因
定义类时需要指定类的名称,但如果仅仅将类名作为类的唯一标识,则不可避免的出现命名冲突的问题。这会给组件复用以及团队间的合作造成很大的麻烦
作用
为了实现项目管理、解决命名冲突以及权限控制的效果
包的定义
在定义一个类时,除了定义类的名称一般还要指定一个包名,格式如下:
package 包名;
包的规范
org.apache.commons.lang.StringUtil
其中StringUtils是类名而org.apache.commons.lang是多层包名,其含义如下:
org.apache表示公司或组织的信息(是这个公司(或组织)域名的反写);
common 表示项目的名称信息;
lang 表示模块的名称信息。
4.import关键字
使用import关键字导入包
使用import关键子导入静态成员,从java5开始支持