当前位置: 首页 > article >正文

6-1.Java 面向对象 - 初级(对象与属性、对象与方法、递归、重载、可变参数、作用域、构造器、对象创建流程详解、this 关键字)

一、对象与属性

1、基本介绍
  • 属性是类的一个组成部分,一般是基本数据类型,也可以是引用数据类型
  1. 属性的定义语法类似变量
【访问修饰符】 【属性类型】 【属性名】;
  1. 属性的定义类型可以为任何类型(基本数据类型、引用数据类型)

  2. 属性如果不赋值,有默认值

2、对象创建与属性访问
  1. 创建对象
// 先声明再创建
Cat cat;
cat = new Cat();
// 直接创建
Cat cat = new Cat();
  1. 访问属性
cat.name;
cat.age;
3、Java 内存结构
  1. 栈:一般存放基本数据类型

  2. 堆:存放对象

  3. 方法区:包括常量池(如字符串)和类加载信息(属性和方法信息)

4、Java 对象创建流程
Person p = new Person();
p.name = "jack";
p.age = 10;
  1. 加载 Person 类信息

  2. 在堆中分配空间,进行默认初始化

  3. 把地址赋给 p,p 指向对象

  4. 进行指定初始化


二、对象与方法

1、基本介绍
public 【返回数据类型】 【方法名】(【参数列表】) {
    【方法体】;
    return 【返回值】;
}
-说明
public访问修饰符
返回数据类型表示成员方法输出的数据类型,void 表示没有返回值
参数列表表示成员方法的输入
方法体表示为实现某一功能的代码块
return表示成员方法的输出(不是必须的)
2、注意事项
(1)返回数据类型
  1. 一个方法最多有一个返回值

  2. 返回类型可以为任何类型(基本数据类型、引用数据类型)

  3. 如果方法有返回数据类型,则方法中最后的执行必须为 return 语句,且 return 的值类型必须和要求返回的数据类型一致

  4. 如果方法有 void,则方法体中可以没有 return 语句

(2)参数列表
  1. 一个方法可以没有参数,也可以有多个参数,中间用逗号隔开

  2. 参数类型可以为任何类型(基本数据类型、引用数据类型)

  3. 调用带参方法时,一定要对应参数列表传入相应类型或兼容类型的参数

  4. 方法定义时的参数成为形式参数,简称形参,方法调用时的参数成为实际参数,简称实参,实参和形参的类型要一致或兼容,个数、顺序必须一致

(3)方法体
  • 里面编写完成功能的具体语句,但里面不能再定义方法
(4)方法调用
  1. 同一个类中的方法可直接调用

  2. 跨类方法调用需要通过对象名调用,受访问修饰符影响

【对象名】.【方法名】(【参数】);
(5)方法名
  • 建议遵循小驼峰式命名法

三、递归

1、基本介绍
  • 递归就是方法自己调用自己,每次调用时传入不同的变量
  1. 执行一个方法就是创建一个新的受保护的独立空间(栈空间)

  2. 方法的局部变量是独立的,不会互相影响

  3. 如果方法中使用的是引用类型变量,会共享该引用类型的数据

  4. 递归必须向退出条件逼近,否则会无限递归

  5. 当一个方法执行完毕或遇到 return 时返回,遵循谁调用,就将结果返回给谁

2、实例实操
  • RecursionTest.java
package com.my.primary;

public class RecursionTest {
    public static void main(String[] args) {
        System.out.println(factorial(10));
        printNum(5);
    }

    // 递归阶乘
    public static int factorial(int num) {
        if (num == 1) {
            return 1;
        } else {
            return factorial(num - 1) * num;
        }
    }

    // 递归打印
    public static void printNum(int num) {
        if (num > 2) {
            printNum(num - 1);
        }
        System.out.println(num);
    }
}

四、重载

  • Java 中允许同一个类中有多个同名方法的存在,但需要满足以下需求
  1. 方法名相同

  2. 参数列表(参数类型,个数)必须不同,参数名无要求

  3. 返回类型无要求


五、可变参数

  • 可变参数可将一个类中多个同名同功能,但参数个数不同的方法,封装成一个方法
【访问修饰符】 【返回数据类型】 【方法名】(【数据类型】... 【形参名】) {
    【方法体】;
    return 【返回值】;
}
  1. 可变参数的实参可以为 0 个或多个

  2. 可变参数的实参可以是数组

  3. 可变参数的本质就是数组

  4. 可变参数可以和普通类型的参数一起放在形参列表,但是必须保证可变参数放在最后

  5. 一个形参列表中只能出现一个可变参数


六、作用域

1、属性和局部变量命名
  1. 属性和局部变量可以重名,访问时遵循就近原则

  2. 在同一个作用域中,两个局部变量,不能重名

2、属性和局部变量生命周期
  1. 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁

  2. 局部变量生命周期较短,伴随的代码的创建而创建,伴随着代码块的销毁而销毁

3、属性和局部变量作用范围
  1. 属性可以被本类或其他类使用

  2. 局部变量只能在本类对应的方法中使用

4、属性和局部变量修饰符使用
  1. 属性可以加修饰符

  2. 局部变量不可以加修饰符


七、构造器

1、基本介绍
【访问修饰符】 【方法名】(【形参列表】) {
    【方法体】;
}
  1. 构造器的访问修饰符可以是默认

  2. 一个类可以定义多个不同的构造器,即构造器重载

  3. 构造器名和类名必须一致

  4. 构造器没有返回值

  5. 构造器是完成对象的初始化,不是创建对象

  6. 在创建对象时,系统自动的调用该类的构造器

  7. 如果没有定义构造器,系统会自动给类生产一个默认的无参构造器

  8. 一旦定义了构造器,默认的无参构造器就会被覆盖,无法使用,但可以显式定义

2、基本使用
  • ConstructorTest.java
package com.my.primary;

public class ConstructorTest {
    public static void main(String[] args) {
        Dog dog = new Dog("阿黄", 2);
        System.out.println(dog.name);
        System.out.println(dog.age);
    }
}

class Dog {
    String name;
    int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

八、对象创建流程详解

1、示例代码
class Dog {
    String name;
    int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
// 创建对象
Dog dog = new Dog("阿黄", 2);
2、流程详解
  1. 加载 Dog 类信息(Dog.class),只会加载一次

  2. 在堆中分配空间(地址)

  3. 默认初始化

age = 0; 
name = null;
  1. 显式初始化
age = 1;
name = null;
  1. 构造器初始化
age = 2;
name = "阿黄";
  1. 把对象在堆中的地址赋给 dog

九、this 关键字

  • this 关键字代表当前对象
  1. this 关键字可以用来访问本类的属性、方法、构造器

  2. this 关键字可用于区分当前类的属性和局部属性

  3. 访问成员

this.【方法名】(【参数列表】);
  1. 访问构造器,只能在构造器中使用,即只能在构造器中访问另外一个构造器,且必须作为第一条语句
this(参数列表);
  1. this 关键字不能在类的外部使用,只能在定义类的方法中使用

http://www.kler.cn/a/383859.html

相关文章:

  • 深入浅出:解读注意力机制,让神经网络更“聪明”
  • 大数据集群中实用的三个脚本文件解析与应用
  • 【简信CRM-注册安全分析报告】
  • UML的另一个主角——用例图
  • string模拟实现插入+删除
  • 关于在GitLab的CI/CD中用docker buildx本地化多架构打包dotnet应用的问题
  • 信息学科平台系统设计与实现:Spring Boot技术手册
  • windows11 安装 maven
  • 【MFC编程(一)】MFC概述
  • 非洲:人口红利下的市场蓝海与五金需求的无限可能
  • leetcode-643. 子数组最大平均数 I
  • Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现
  • 右旋圆极化散射后的stocks矢量 与T3矩阵的关系
  • 【UE5】Cesium GlobePawn 如何Fly To
  • YOLOv11融合IncepitonNeXt[CVPR2024]及相关改进思路
  • CertiK发现三星区块链密钥库的高风险漏洞,第3次获得致谢
  • qt QHeaderView详解
  • C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(3)
  • lerna+umi ‘max‘ 不是内部或外部命令,也不是可运行的程序
  • ./bin/mindieservice_daemon启动成功
  • 基于STM32的实时时钟(RTC)教学
  • Spring配置文件初始化加载(一)
  • Redis学习:Redis可重入分布式锁、Redlock算法和底层源码分析
  • 如何用Python精确计算当前时间之前一年、一月和一天
  • golang分布式缓存项目 Day 1
  • rust编写的系统监测器