1.面向对象的初步认识
1.1什么是面向对象
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面 向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人 们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
1.2面向对象与面向过程
面向过程:例如做饭,你需要考虑什么时候生火,添油加醋
面向对象:把大象放进冰箱,打开冰箱,把大象塞进冰箱,关上冰箱
面向过程需要一步一步参与,而面向对象则是对象和对象的合作
2.类定义与使用
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干 啥),描述完成后计算机就可以识别了
2.1 类的定义格式
语法:
创建类
class 类名(定义的时候使用大驼峰 形如Test){
字段//属性或成员变量
行为 或者 成员方法
}
一般建议一个Java文件一个类
现在我们知道了什么是类,那么要怎么去使用呢?
3.类的实例化
3.1 什么是实例化
由 类 生成 对象 的过程叫做实例化
Dog dog = new Dog();
可以理解为栈内存保存了堆内存的地址,也就是对象的名字
而堆内存保存了对象的属性内容,需要用new来开辟空间
3.2 类和对象的说明
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog.name);
System.out.println(dog.age);
System.out.println(dog.color);
dog.bark();
dog.eat();
}
}
我们尝试运行一下
我们可以看到在没给对象赋值之前也可以使用,只是为空值
在测试类里给它赋值
结果是这样的
结论:通过对象的引用,可以去访问成员变量也可以去访问成员方法。
3.3 成员变量与全局/局部变量的区别
成员变量在使用时可以不用初始化,但是全局/局部变量在使用时需要初始化
4.this引用
4.1 this的用法
1.访问当前对象的成员变量
2.访问当前对象的成员方法
3.访问当前对象的其他构造方法
4.2 this引用的特性
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该 引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
这边再写一个测试类和一个日期类
public class Test {
public static void main(String[] args) {
Data date = new Data();
Data date1 = new Data();
Data date2 = new Data();
date.SetDate(2024,5,15);
date1.SetDate(2005,2,5);
date2.SetDate(2006,3,4);
date.PrintDate();
date1.PrintDate();
date2.PrintDate();
}
}
public class Data {
public int year;
public int month;
public int day;
public void SetDate(int y,int m,int d){
year = y;
month = m;
day = d;
}
public void PrintDate(){
System.out.println(year + "年 " + month + "月 " + day + "日 ");
}
}
让我们来运行一下
但是如果把形参名改成和成员变量名一样呢
public void SetDate(int year,int month,int day){
year = year;
month = month;
day = day;
}
运行结果
那么我们可以提出两个问题
1.既然方法一样,那么怎么判断哪个对象调用了呢?
2.形参名和成员变量名一样为什么会是空值?
第一个问题:方法一样通过传入的形参不同来判断
第二个问题:由于此时存在局部变量,局部变量优先使用
那么要怎么解决第二个问题呢?
答案是加this关键字
public void SetDate(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
加入this关键字之后就解决了第二个问题
this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收
这个地方写或者不写都是没有关系的
5.对象的构造及初始化
5.1构造方法的介绍
刚才在this中提到了构造方法,那么什么是构造方法呢?
我们先来了解一下构造方法的特点
构造方法:
名字与类名相同,没有返回值类型,设置为void也不行
一般情况下使用public修饰
在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
简单来说构造方法就是用来初始化对象中的成员
例如:
public Data(){
this.year = 1998;
this.month = 2;
this.day = 5;
}
而当你没有写任何构造方法时,Java会自己给你提供一个不带参数的构造方法,也就是上文不给参数默认空值的原因。
一旦用户定义则不会再生成
以上是不带参数的构造方法
public Data(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
在初始化对象的时候就可以给值
需要注意的是:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
5.2介绍一个快捷创建构造方法的方式
右键空白处
按住ctrl的同时选中
就可以创建构造方法了
5.3this在构造方法里的作用
刚才说到this可以访问当前对象的其他构造方法
public Data() {
this(9999,2,5);
}
public Data(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
此处可以在无参构造方法中通过this调用带有三个参数的构造方法
要注意的是this必须为构造方法的第一句。
5.4默认初始化
初始化就是new一个对象
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题 比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
4. 初始化所分配的空间:
初始化好了会赋予初始值,例如:
5. 设置对象头信息(关于对象内存模型后面会介绍)
6. 调用构造方法,给对象中各个成员赋值
5.5就地初始化
在创建成员变量的时候就给他初始值
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中