[豪の学习笔记] JavaReStudy#06
Published on 2025-02-24 16:54 in 分类: [豪の学习笔记] with 舒旭豪 SchwarzShu

[豪の学习笔记] 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不能在类定义的外部使用,只能在类定义的方法中使用

posted @   SchwarzShu  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示