目录
本篇文章为JavaSE中的重点内容 希望大家好好看看
一. 面向对象的初步认知
1.1 什么是面向对象
- Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。
- 面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。
- 用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好
1.2 面向对象与面向过程
举例说明面向对象与面向过程的区别:
面向过程:
传统洗衣服过程
传统的方式:注重的是洗衣服的过程,少了一个环节可能都不行。 这就是面向过程
C语言就是面向过程的语言
面向对象:
现代洗衣服过程:
整个洗衣服过程:人把衣服放进洗衣机,倒入洗衣粉到洗衣机,启动洗衣机。衣服便总动洗好
总共分为四步,整个过程都是由这四个对象交互完成,不需要管它如何实现洗衣服这些过程,更注重结果
总共四个对象:人,衣服,洗衣机,洗衣服
以面向对象方式来进行处理,就不关注洗衣服的过程,具体洗衣机是怎么来洗衣服,如何来甩干的,用户不用去关心,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的。
注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。
二. 类定义和使用
2.1 简单认识类
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。
例如:
比如:洗衣机,它是一个品牌,在Java中可以将其看成是一个类别。
属性:产品品牌,型号,产品重量,外观尺寸,颜色...
功能:洗衣,烘干、定时....
2.2 类的定义格式
在java中定义类时需要用到class关键字
// 创建类
class ClassName{
field; // 字段(属性) 或者 成员变量
method; // 行为 或者 成员方法
}
- class为定义类的关键字
- ClassName为类的名字
- {}中为类的主体
类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法。
例如刚才的洗衣机我们可以给它描述:
class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}
再定义一个狗类:
class Dog {
public String name;
public String color;
public int age;
public void eat() {
System.out.println(name + "吃东西");
}
public void wag() {
System.out.println(name + "摇尾巴");
}
}
注意事项:
- 类名注意采用大驼峰定义
- 成员前写法统一为public
- 此处写的方法不带 static 关键字
- 一般一个文件当中只定义一个类
- public修饰的类必须要和文件名相同
- public修饰的类必须要和文件名相同
三. 类的实例化
3.1 什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似 ,只不过int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型;
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
3.2 实例化对象
拿上处狗的例子来举例:
这样我们就通过new 来创建了一个dog对象,并且对它可以实例化对象
通过. 可以通过类对象访问到它里面的对象 ,并且可以对它初始化
注意事项:
- new 关键字用于创建一个对象的实例.
- 使用 . 来访问对象中的属性和方法.
- 同一个类可以创建对个实例
类和对象的说明:
1. 类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
2. 类是一种自定义的类型,可以用来定义变量.
3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
习题:
1.引用可以指向-引用吗?
解析:不能。引用只能指向对象
只能这样说,dog2指向了dog1所指向的对象
2.一个引用 能不能同时指向 多个对象吗?
解析:不行的 dog1这个引用,只能存储一个对象
3.dog1指向了null对象?
解析:错误 ,dog1不指向任何对象
实现俩个数字的交换(重点)
class myValue1 {
public int val;
}
class myValue2 {
public int val;
}
public class Test {
public static void swap(myValue1 val1,myValue2 val2) {
int tmp = val1.val;
val1.val = val2.val;;
val2.val = tmp;
}
public static void main(String[] args) {
myValue1 val1 = new myValue1();
val1.val = 10;
myValue2 val2 = new myValue2();
val2.val = 20;
System.out.println("交换前");
System.out.println(val1.val);
System.out.println(val2.val);
swap(val1,val2);
System.out.println("交换后");
System.out.println(val1.val);
System.out.println(val2.val);
}
}
注意基本类型一定不能进行交换,一定要通过引用访问它们中的对象,从地址上改变了它们的对象
四. this引用(重点)
4.1 为什么要有this引用
引用一个例子就明白了:
public class Date {
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 static void main(String[] args) {
Date date = new Date();
date.setDate(2023,11,11);
date.printDate();
}
}
这里是成功打印出来了,而现在我稍作一点改变 ,就会发生错误
原来:
现在:形参名不小心与成员变量名相同
再来看看打印结果
只是修改了变量名字,为什么就打印不出来
原因是
这里都使用了局部变量,并没有赋值到
局部变量优先使用
接下来就可以使用this 这个方法
4.2 this的使用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
即使写了很多个,系统都可以自动识别出 :
this引用的是调用成员方法的对象。
4.3 this引用的特性
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
- this只能在"成员方法"中使用
- 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
五.对象的构造及初始化
5.1 默认初始化
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
1. 检测对象对应的类是否加载了,如果没有加载则加载
2. 为对象分配内存空间
3. 处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突4. 初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值
所以它们都有默认值
5.2 就地初始化
在声明成员变量时,就直接给出了初始值。
5.3 构造方法(重点)
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
构造方法的调用 是在实例化对象的时候
之前没有构造的方法,也会被执行,只不过是不带任何参数的
构造方法至少有一个,Java会自带一个不带任何参数的
名字相同,参数列表不同,因此构成了方法重载。
这里就可以对成员变量进行初始化
假如只写了一个构造方法:
假如你创建了一个带参数的构造方法,但这里却调用不带参数的构造方法,就会报错,因为必须使用你创建了那个构造方法,如果没写构造方法,才可以写不带参数的。
这里由一个编写构造方法的快捷方法,就不用一个一个输入:
或者直接用快捷键alt+insert 想创建几个就可以创建几个
总结:
明天更新 【Java SE】封装
如有不足之处欢迎补充交流
看到这里的友友们,支持一下博主,来个免费三连,感谢! ! !