Java面向对象
1.面向对象概述
1.1 vs 面向过程
面向过程:你找对象为例,你每一步都亲力亲为,动作的一个执行者
面向对象:找一个合适的人帮你干活。红娘
,动作的指挥者
面向对象的核心:就是找到合适的人,帮你干活【调用各种方法】
1.2 OOP/OOA
OOP:Oriented Object Programming,面向对象编程
OOA:Oriented Object Arti…,面向对象分析/设计
2.对象
世界由什么组成的?原子、万物、人、动物…
我们在认识世界的过程中,无形以分类去划分。
2.1对象的概念
万物皆对象
对象[物]:客观存在的实体/事务,比如一班的张三,即张三就是一个对象。
类:是一个抽象的概念,将其当做一个模版。
2.2寻找身边的对象
比如 教室的椅子
2.3 程序中怎么用
在java中,类是代码的组织单元【即我们的代码需要在类体中编写】,我们的对象需要通过类创建
出来。
找对象的特征:(静态特征+动态特征)
静态特征【属性】:身高、身材、性别、年龄…
男:属性的值
动态特征【方法】:一般是动宾结构,吃喝拉撒睡,学习
在分析对象的特征的时候,要根据场景去分析出他的属性和方法,无法且没有必要穷举出所有的属
性和方法。
三步走:
需求:编写一个学生类,学号、名字、分数,打印学生信息
2.3.1编写一个类
共性:属性和方法,将属性和方法写在一个文件中,这个文件是通过类组织
思考:Java源码本身提供了很多类,为什么还要自定义的。它不知道你具体类的属性和方法是啥,
也无法穷举世界万物。所以,它提供了一个种自定义类的方式
public class Student{
String name;
String stuNo;
int score;
public void showInfo(){
System.out.println("姓名:" + name + ",学号:" + stuNo + ",分数:" + score);
}
}
2.3.2创建对象
Student stu = new Student();
2.3.3 使用对象
// 3.使用对象,使用对象的属性和方法
// 3.1 使用属性
String name = stu.name; //获取属性值
System.out.println("修改之前:" + name);
stu.name = "zs"; //修改属性值
System.out.println("修改之后:" + stu.name);
//3.2 调用方法
stu.showInfo();
3.构造方法
若自定义了有参构造,那么你要给加上无参构造 因为加了有参之后,系统将不再赠送无参构造
3.1作用
-
创建对象: new 构造方法(有就传)
-
为属性赋初始值
3.2 特点
-
方法名称跟类名一致
-
我们没有定义这样的一个特殊方法,但是可以调用,说明JDK默认给我们提供了一个无参构造
-
一旦我们显示定义有参构造,则默认的无参构造将失效。
-
往往我们就需要使用无参构造,此时你应该自定义一个无参构造
-
构造方法也有重载
-
没有返回值,连void也不能有
4.this关键字
代表:代表的就是当前对象,就你造的哪个对象,代表的就是谁;只能用在你设计的那个类中
用法:
this.成员变量
:可以解决在构造方法中,跟形参重名的问题;在方法中调用的时候,可以增加可
读性
-
this.当前类的方法名
:此处this
可以省,增加可读性 -
this(构造方法的参数)
:可以在构造方法中调用其他的构造方法,必须放在构造方法的第一行
在一个构造方法中调用其他构造方法的目的:可以节省很多代码
5.类图
5.1 简介
可以画类图的工具【设计工具】:
-
processon
:https://www.processon.com/ -
draw.io
:https://app.diagrams.net/ -
startuml
:https://staruml.io/ 可以直接生成java代码 -
powerDesigner
:是一款强大的设计工具,可以画很多图
5.2 对象在内存中的结构图
作为扩展了解
public class TestStudent {
public static void main(String[] args) {
int n = 10; //栈存储
int m = 10; //栈存储
Student stu = new Student();
//属性赋值
stu.name="张三";
System.out.println(stu.name); //null 张三
System.out.println(stu.age); //0
//调用
String name = "ls"; //局部变量(常量池)
String aaaa="ls";
String pwd = "123";
stu.login(name,pwd);
System.out.println("name:"+name); //ls
System.out.println("执行");
}
}
class Student {
// 属性
String name;
int age;
//用户登录
// String userName;
// String pwd;
public void login(String userName,String pwd){
System.out.println(userName+"===="+pwd); //ls 123
}
public void show() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
栈:存局部变量和对象引用
堆:存new出来的东西
常量池:存字符串,多个字符串变量的值都相同时,他们在栈中存的地址相同,都是指向常量池中同一个值
基本数据类型的变量,就算值相同都会分别在栈中存储,不会存到常量池中
当方法运行结束后,栈中方法的局部变量会被删除,但常量池中的值不会消失
6.成员变量vs局部变量
-
位置不同
①成员变量:在类中
②局部变量:在方法中,形参,代码块
-
初始值不同
①成员变量:有初始值,比如引用类型null,基本类型比如int 0
②局部变量:必须初始化,才能使用【必须显示赋值,才能使用】
-
作用范围不同
①成员变量:整个类中
②局部变量:它所在的{}范围
-
在内存中的区域不同
栈 vs 队列:
栈:先进后出
队列:先进先出 FIFO —》First in First out
①成员变量:在堆内存中
②局部变量:在栈中
-
生命周期不同
①成员变量:随着对象的存在而存在,对象被标记为垃圾对象,需要一个过程,同时回收也需要一
个过程
②局部变量:在栈中,用完之后就出栈
7.对象数组
与普通数组没啥区别 就是数组中存放的是对象的地址值,指向栈内存中的对象
明确:
-
数组如何定义?
数据类型[] 数组名称
-
对象的数据类型是啥? 它的所属类,即该对象是通过哪个类【模版】造出来的。String name; Stu
stu
- 是否可以通过数组的方式操作对象?比如,获取到该班级所有学生的名字