[豪の学习笔记] JavaReStudy#06
面向对象编程
1 - 类与对象
类与对象的区别和联系
类是抽象的,概念的,代表一类事物
对象是具体的,实际的,代表一个具体事务
类是对象的模板,对象是类的一个个体,对应一个实例
属性/成员变量/字段
class Car{
String name;
double price;
String color;
String[] master;
}
属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型(对象,数组)
属性注意事项和细节说明
属性的定义语法同变量: 访问修饰符 属性类型 属性名
属性的定义类型可以为任意类型
属性如果不赋值,有默认值,规则和数组一致
创建对象
1.先声明再创建
Cat cat;
cat = new Cat();
2.直接创建
Cat cat = new Cat();
访问属性
对象名.属性名;
类与对象的内存分配机制
Person p1 = new Person();
p1.age = 10;
p1.name = "小米";
Person p2 = p1; // 把p1赋给了p2,让p2指向p1
System.out.println(p2.age);
类与对象的内存分配机制
1.Java内存的结构分析
栈:一般存放基本数据类型(局部变量)
堆:存放对象(Cat cat,数组...)
方法区:常量池(常量,如字符串),类加载信息
2.Java创建对象的流程简单分析
Person p = new Person();
p.name = “JackeyChen”;
p.age = 66;
先加载Person类信息(属性和方法信息,只会加载一次)
在堆中分配空间,进行默认初始化
把地址赋给p,p指向对象
进行指定初始化,如 p.name = “JackeyChen”;
2 - 成员方法
方法调用机制原理
public class Main{
public static void main(String[] args){
Person p1 = new Person();
int returnRes = p1.getSum(10, 20);
System.out.println("getSum方法返回的值=" + returnRes);
}
}
class Person{
String name;
int age;
public int getSum(int num1, int num2){
int res = num1 + num2;
return res;
}
}
当程序执行到方法时,就会开辟一个独立的空间(栈空间)
当方法执行完毕或者执行到return语句时,就会返回
返回到调用方法的地方
返回后继续执行方法后面的代码
当main方法(栈)执行完毕,整个程序退出
成员方法的好处
1.提高代码的复用性
2.可以将实现的细节封装起来,供其他用户调用
成员方法的定义
访问修饰符 返回数据类型 方法名 (形参列表...){
语句
return 返回值;
}
形参列表:表示成员方法输入,如 getSum(int num1, int num2)
返回数据类型:表示成员方法输出,void表示没有返回值
方法主体:表示实现某一功能的代码块
return语句不是必须的
使用细节和注意事项
1.形参列表
一个方法可以有0个参数,也可以有多个参数
方法定义时的参数称为形式参数,方法调用时的传入参数称为实际参数
调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
实参和形参的类型要一致或兼容,个数和顺序必须一致
2.定义
方法不能嵌套定义,即方法体中不能再定义方法
访问修饰符如果不写则为默认访问
3.返回数据类型
一个方法最多有一个返回值
返回类型可以为任意类型
如果方法要求有返回数据类型,则方法体中最后执行的语句必须为return值,且要求返回值类型必须和return的值类型一致或兼容
如果方法是void,则方法体中可以没有return语句或只写return;
方法调用细节说明
1.同一个类中的方法调用:直接调用即可
2.跨类中的方法,A类调用B类方法:需要通过对象名调用
3.跨类的方法调用和方法的访问修饰符相关
class A{
public void print(int n){
System.out.println("A-print方法调用:" + n);
}
public void speak(){
print(10); // 同一个类中的方法调用,直接调用即可
System.out.println("A-speak方法调用");
}
public void maa(){
System.out.println("A-maa方法调用");
B b = new B(); // 跨类中的方法,A类调用B类方法,需要通过对象名调用
b.hello();
System.out.println("A-maa方法继续执行");
}
}
class B{
public void hello(){
System.out.println("B-hello方法调用");
}
}
成员方法传参机制
1.基本数据类型的传参机制
基本数据类型传递的是值(值拷贝),形参的任何改变不影响实参
2.引用数据类型的传参机制
引用类型传递的是地址(传递也是值,但值是地址),可以通过形参影响实参
3 - 递归
执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
方法的局部变量是独立的,不会相互影响
如果方法中使用的是引用类型变量(如数组,对象),就会共享该引用类型的数据
递归必须向退出递归的条件逼近,否则就是无限递归,出现栈溢出
当一个方法执行完毕或者遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕
4 - 方法重载
Java中允许同一个类中多个同名方法的存在,但要求形参列表不一致
方法名必须相同
形参列表必须不同(形参类型或个数或顺序,至少有一项不一样,参数名无要求)
返回类型无要求
5 - 可变参数
Java允许将同一个类中多个同名同功能但参数个数不同的方法,通过可变参数封装成一个方法
基本语法
访问修饰符 返回类型 方法名(数据类型... 形参名){
}
public int sum(int... nums){
System.out.println("接收的参数个数=" + nums.length);
int res = 0;
for(int i = 0;i < nums.length; i++){
res += nums[i];
}
return res;
}
注意事项和使用细节
可变参数的实参可以为0个或任意多个
可变参数的实参可以为数组
可变参数的本质就是数组
可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
一个形参列表中只能出现一个可变参数
6 - 作用域
在Java编程中,主要的变量就是属性(成员变量)和局部变量
全局变量:即属性,作用域为整个类体
局部变量:除了属性之外的其他变量,作用域为定义它的代码块中
全局变量可以不赋值,直接使用,因为有默认值
局部变量必须复制后才能使用,因为没有默认值
注意事项和使用细节
属性和局部变量可以重名,访问时遵循就近原则
在同一个作用域中,两个局部变量不能重名
生命周期不同:
属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁
局部变量生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁
作用域范围不同:
全局变量可以被本类或其他类使用(通过对象调用)
局部变量只能在本类中对应的方法中使用
修饰符不同:
全局变量可以加修饰符
局部变量不可以加修饰符
7 - 构造方法/构造器
基本语法
[修饰符] 方法名(形参列表){
方法体;
}
基本介绍
构造方法又叫构造器,是类的一种特殊方法,它的主要作用是完成对新对象的初始化
方法名与类名相同
参数列表和成员方法一样的规则
没有返回值,但也不能写void
在创建对象时,系统会自动地调用该类的构造器完成对象的初始化
class Person(){
String name;
int age;
public Person(String pName, int pAge){
name = pName;
age = pAge;
}
}
注意事项和使用细节
一个类可以定义多个不同的构造器,即构造器重载
构造器名要与类名相同
构造器无返回值
构造器是完成对象的初始化,不是创建对象
在创建对象时,系统会自动地调用该类的构造方法
如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器)
一旦定义了自己的构造器,默认的构造器就被覆盖了,即不能再使用默认的无参构造器,除非显式地定义一下
8 - 对象创建的流程分析
class Person{
int age = 66;
String name;
Person(String pName, int pAge){
name = pName;
age = pAge;
}
}
Person p = new Person("shushu", 18);
1.加载Person类信息(Person.class),只会加载一次
2.在堆中分配空间(地址)
3.完成对象初始化
3.1 默认初始化 age = 0,name = null
3.2 显式初始化 age = 66,name = null
3.3 构造器的初始化 age = 18,name = shushu
4.将对象在堆中的地址返回给p(p为对象名,也可理解为对象的引用)
9 - this关键字
Java虚拟机会给每个对象分配this,代表当前对象
class Dog{
String name;
int age;
public Dog(String name, int age){
this.name = name;
this.age = age;
}
}
注意事项和使用细节
this关键字可以用来访问本类的属性、方法、构造器
this用于区分当前类的属性和局部变量
访问成员方法的语法:this.方法名(参数列表);
访问构造器语法:this(参数列表); 注意只能在构造器中使用,即只能在构造器中访问另一个构造器,必须放在第一条语句
this不能在类定义的外部使用,只能在类定义的方法中使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!