Java面向对象(初级)

面向对象编程(基础)

  • 面向对象编程(OOP)是一种编程范式,它强调程序设计是围绕对象、类和方法构建的。在面向对象编程中,程序被组织为一组对象,这些对象可以互相传递消息。面向对象编程的核心概念包括封装、继承和多态。

  • 相对应的,面向对象编程的对立面可以说是面向过程编程(Procedural Programming)。在面向过程编程中,程序主要由一系列的步骤或过程组成,更加侧重于顺序执行。与面向对象编程不同,面向过程编程没有对象的概念,而是专注于如何分解问题和编写独立的函数来解决它们。

两者对比:

特征面向过程编程面向对象编程
组织方式注重顺序执行,数据和功能分离数据和功能被组织成对象
可维护性较差,修改可能需要涉及多个部分更好,通过封装和抽象降低耦合度
可重用性较差,函数通常与特定问题耦合更高,对象和类的概念提高了代码的重用性
可扩展性较差,添加新功能可能需要对多处进行修改更强,继承和多态特性使得修改和扩展更为容易
代码复杂度高,数据和功能交织在一起,难以理解和维护低,通过对象的封装和抽象,代码结构更清晰
适用场景小型、直接问题的解决大型、复杂问题的解决

面向对象编程比面向过程编程可以适用更加复杂的场景。

1、类与对象

类是一种数据类型,是抽象、泛指的概念,定义了对象的属性和行为,但是并不是一个具体的实体。一个类可以有多个对象。并不占用空间

对象是一个类的具体的实例,拥有类描述的特征和行为。占据内存空间

在这里插入图片描述

对象在内存中的存储方式:

  1. 栈: 一般存放的是基本的数据类型(局部变量)
  2. 堆:存放的是对象(数组、Person等)
  3. 方法区:常量池(常量,比如字符串),类的加载信息。
(1)属性/成员变量/字段

属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。比如我们前面定义猫类的int age 就是属性

属性的定义语法同变量,示例:访问修饰符 属性类型 属性名;

共有四种访问修饰符:public, proctected, 默认, private

属性如果不赋值,有默认值,规则和数组一致。具体说: int 0short 0, byte 0, long 0, float 0.0``,double 0.0char \u0000boolean falseString null

举例:

class person{
    //四个属性:性别,姓名,年龄,存款
    String name;
    int age;
    double stroage;
    boolean gender;
}
(2) 创建对象
  1. 先声明,再创建

    //1、先声明再创建
    Person xiaoming;
    xiaoming = new Person();
    
  2. 直接创建

    //2、直接创建
    Person xiaoming = new Person();
    
(3)访问对象的属性

基本语法
对象名.属性名;

//访问属性
xiaoming.name;
xiaoming.age;
xiaoming.stroage;

2、成员方法

Java中的成员方法是指属于类或对象的函数,用于执行特定的操作或者返回特定的数值。它们可以访问类的属性和其他方法。

(1)方法调用机制

方法调用机制:执行方法或者函数时,会开辟一个独立的空间。

在这里插入图片描述

(2)成员方法的好处
  1. 可以提高代码的复用性
  2. 将实现的细节封装起来,可以供其他用户调用
(3)成员方法定义

访问修饰符 返回数据类型 方法名(形参列表){

语句:

return 返回值;

}

示例:

   public void f3(String s, int n){
        int m = n;
        return;			//没有返回值
    }
}
(4)类定义完善

在这里插入图片描述

3、成员方法传参机制

  • 基本数据类型:采用的事值传递(值拷贝),形参改变不影响实参。

  • 引用数据类型:引用类型传递的是地址**(传递的也是值,但是是地址的值),可以通过形参影响实参。**

        public static void main(String args[]){
            //引用传参,传递的是地址,拷贝了一份地址的值
            Person xiaoming = new Person();
            xiaoming.name = "小明";
            xiaoming.stroage = 1202.23;
            xiaoming.f3(xiaoming);
            //虽然穿进的f3将xiaoming置为空了,但是外面的xiaoming不影响,只是在新的栈空间拷贝了一份地址。
            System.out.println("xiaoming"+xiaoming.stroage);
        }
    }
    class Person{
        String name;
        double stroage;
        public void f3(Person xiaoming){
            xiaoming = null;
        }
    

4、overload(方法重载)

(1)概念

java方法重载指的是在同一个类中可以有多个方法具有相同的名称,但参数列表不同的情况。参数列表可以包括参数的类型、数量或顺序。

(2)优点
  • 代码可读性和易用性:相同方法名结合不同的参数类型或数量可以简化代码并提高易用性。
  • 灵活性:允许处理不同类型或数量的输入。
  • 避免命名冲突:避免为不同功能编写相似但不同的方法名。
  • 代码复用:通过重载方法,可以避免为每个略有不同的情况编写新的方法,提高了代码的复用性。
(3)举例
public class MathHelper {
    // 重载的方法1:计算两个整数之和
    public int add(int a, int b) {
        return a + b;
    }

    // 重载的方法2:计算三个整数之和
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 重载的方法3:计算两个小数之和
    public double add(double a, double b) {
        return a + b;
    }
}
(4)注意事项
  • 方法名必须相同
  • 形参列表,必须不同,(形参类型或者个数或者顺序,至少一样不同,参数名没有要求)
  • 返回类型,没有要求

5、可变参数

(1)概念

可变参数允许方法接受不定数量的参数。在 Java 中,使用省略号 ... 来表示可变参数。这些参数被封装为数组,并且只能出现在方法参数列表的最后。

(2) 基本语法

基本的语法:

javaCopy codepublic void methodName(DataType... parameterName) {
    // 方法体
}

其中:

  • methodName 是方法的名称。
  • DataType 是可变参数的数据类型。它可以是任何数据类型,甚至可以是自定义的类。
  • parameterName 是可变参数的名称。习惯上使用复数形式,如 numbersvalues 等,但也可以使用其他合适的名称。
  • ... 表示可变参数的语法。
(3)举例
public class MyClass {
    public void printValues(String... values) {
        for (String value : values) {
            System.out.println(value);
        }
    }

    public static void main(String[] args) {
        //可变参数
        MyClass obj = new MyClass();
        obj.printValues("Hello", "World");
        obj.printValues("Java", "is", "awesome");
        obj.printValues(); // 可以不传入任何参数
    }
}
(4)注意事项
  1. 可变参数实参可以为0个或者多个
  2. 可变参数的实参可以为数组
  3. 可变参数的本质就是数组
  4. 可变参数可以和普通类型参数一起放在形参列表,但是必须保证可变参数在最后面
  5. 一个形参列表当中只可以出现一个可变参数

6、作用域

(1)基本概念

在java中,变量主要有两种,一种是属性(类里面的成员,也可以成为全局变量)变量一种是局部变量。一般的局部变量是指定义在成员方法中的变量,作用域是定义的代码块中,随着代码块的执行而创建,随着代码块的结束而销毁。。全局变量,一般是指属性,作用域为整个类。伴随着对象的创建而创建,对象的销毁而销毁。

(2)异同点
  1. 声明位置
    • 属性变量(成员变量):定义在类中,但在任何方法、构造函数或块之外。
    • 局部变量:定义在方法、构造函数或块内部。
  2. 作用域
    • 属性变量(成员变量):整个类可见,或者其他类使用(通过对象调用)。
    • 局部变量:仅在所属的方法、构造函数或块中可见。
  3. 默认值
    • 属性变量(成员变量):如果未显式初始化,会有默认值。
    • 局部变量:必须在使用之前显式初始化,没有默认值,否则会产生编译错误。
  4. 生命周期
    • 属性变量(成员变量):对象创建至销毁。
    • 局部变量:方法执行期间。
  5. 修饰符(public,private,protected,默认)
    • 属性变量(成员变量):可以加修饰符。
    • 局部变量:不可以加修饰符。

全局变量和局部变量可以重名,访问的原则是就近原则。

(3) 举例
public class Example {
        // 属性变量(成员变量)
        private int memberVariable;
    public void someMethod() {
        // 局部变量
        int localVar = 10;
        System.out.println(memberVariable); // 成员变量在类的任何方法中可见
        System.out.println(localVar); // 局部变量仅在 someMethod() 方法中可见
    }

    public void anotherMethod() {
        // 局部变量
        int anotherLocalVar = 20;
        // System.out.println(localVar); // 这里会产生编译错误,局部变量 localVar 不可见
        System.out.println(anotherLocalVar);
    }
}

7、构造器(构造方法)

构造类是类的一种特殊方法,主要作用就是完成对新对象的初始化。

(1)概念

构造器用于在创建对象时进行初始化。构造器的名称必须与类名完全相同,并且没有返回类型,甚至不是 void 类型。它们的主要作用是初始化新创建的对象,并且在使用 new 关键字实例化对象时被自动调用。

(2) 特点
  1. 与类同名:构造器的名称必须与类名完全相同。
  2. 没有返回类型:与普通方法不同,构造器没有返回类型。
  3. 自动调用:在使用 new 关键字创建对象时,构造器会自动被调用。
  4. 重载: 一个类可以定义多个不同的构造器
  5. 默认构造器: 如果没有定义构造器,系统会自动生成一个默认的无参的构造器
  6. 覆盖默认构造器:一旦自己定义了一个新的构造器,默认的构造器就被覆盖了,除非自己显示定义一下。即:Dog(){}
(3)举例
public class Car {
    private String make;
    private String model;
    private int year;

    // 构造器1:接受三个参数
    public Car(String make, String model, int year) {
        this.make = make;
        this.model = model;
        this.year = year;
    }

    // 构造器2:接受两个参数(默认年份为0)
    public Car(String make, String model) {
        this.make = make;
        this.model = model;
        this.year = 0; // 默认年份为0
    }

    // 构造器3:接受一个参数(默认制造商为Unknown,型号为Unknown,年份为0),无参构造器,显示定义
    public Car() {
        this.make = "Unknown";
        this.model = "Unknown";
        this.year = 0;
    }

    // 其他方法
    public void displayDetails() {
        System.out.println("Make: " + make + ", Model: " + model + ", Year: " + year);
    }

    public static void main(String[] args) {
        // 使用不同的构造器创建对象
        Car car1 = new Car("Toyota", "Corolla", 2022);
        Car car2 = new Car("Honda", "Civic");
        Car car3 = new Car();

        // 显示对象的属性信息
        car1.displayDetails();
        car2.displayDetails();
        car3.displayDetails();
    }
}
(4)对象创建的流程

代码如下:

//类person
class Person{
    int age = 90;
    String name;
    
    //构造器
    Person(String n, int a){
        name = n;       //给属性赋值
        age = a;
    }
}

Person p = new Person("小明", 20);

流程分析如下:

  1. 加载Person类信息(Person.class),只会加载一次
  2. 在堆中分配空间(地址)
  3. 完成对象的初始化
    1. 第一步:默认初始化,age = 0, name = null;
    2. 第二步: 显式初始化,age = 90, name = null
    3. 第三步:构造器初始化,age = 20, name = 小明
  4. 在对象在堆中的地址,返回给p(p是对象名,也可以理解成对象的引用)

到目前为止,类的定义如下:
在这里插入图片描述

8、this

(1)概念

java 虚拟机会给每个对象分配this,this 可以在类的方法中引用当前对象的实例。例如,在类的方法内部使用 this 可以访问当前对象的属性和方法。

(2)内存理解

this可以理解为一个当前对象,存在当前对象的堆内存当中,**这个对象指向的地址就是本身对象所处的地址。**如下图所示:
在这里插入图片描述

(3)举例
public class changeKind {
    public static void main(String args[]){
        Person p = new Person("小明", 20);
        //hashcode可以近似表示对象的地址,可以输出this和当前对象的hashcode看看对象是否一样
        System.out.println("person的地址:"+p.hashCode());
        //输出:person的地址:1163157884
        p.info();
        //输出:小明当前对象的hashcode是1163157884,与前面的相同
        //说明this指向当前对象,哪个对象调用,this就代表哪个对象
    }
}
//类person
class Person{
    int age = 90;
    String name;
    //构造器
    Person(String n, int a){
        name = n;       //给属性赋值
        age = a;
    }
    public void info(){
        System.out.println(this.name+"当前对象的hashcode是"+this.hashCode());
    }
}
(4)注意事项
  1. this关键字可以访问本类的属性,方法和构造器

  2. this可以用来区分当前类的属性和局部变量

  3. 访问成员方法的语法:this.方法名(参数列表);

  4. 访问构造器语法:this(参数列表);注意只能在构造器中使用 (在构造器中访问另外一个构造器,必须放在构造器的第一条语句)

    class T{
        public  T(){
            //必须放在构造器的第一条语句,在一个构造器中访问另外一个构造器
            this("jack",100);
            System.out.println("T()构造器");
        }
    
        public T(String name, int age){
            System.out.println("T(String name, int age)构造器");
        }
    }
    
  5. this不能在类定义的外部使用,只能在类定义的方法中使用。

9、递归

递归的重要规则:

  1. 执行一个方法时,就会创建一个新的受保护的独立空间(栈空间)
  2. 方法的局部变量是独立的,不会相互影响
  3. 如果方法中使用的是引用类型的变量(比如:数组,对象),就会共享该引用类型的数据
  4. 递归必须向退出条件逼近(递归出口),否则就是无限递归,出现栈溢出的情况
  5. 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就会将结果返回给谁。当方法执行完毕或者返回时,该方法也就执行完毕了。

举例:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/264598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023.12.21 关于 Redis 常用数据结构 和 单线程模型

目录 各数据结构具体编码方式 查看 key 对应 value 的编码方式 Reids 单线程模型 经典面试题 IO 多路复用 Redis 常用数据结构 Redis 中所有的 key 均为 String 类型,而不同的是 value 的数据类型却有很多种以下介绍 5 种 value 常见的数据类型 注意&#xff1…

阿里云 ACK One 新特性:多集群网关,帮您快速构建同城容灾系统

云布道师 近日,阿里云分布式云容器平台 ACK One[1]发布“多集群网关”[2](ACK One Multi-cluster Gateways)新特性,这是 ACK One 面向多云、多集群场景提供的云原生网关,用于对多集群南北向流量进行统一管理。 基于 …

虚拟机的下载、安装(模拟出服务器)

下载 vmware workstation(收费的虚拟机) 下载vbox 网址:Oracle VM VirtualBox(免费的虚拟机) 以下选择一个下载即可,建议下载vbox,因为是免费的。安装的时候默认下一步即可(路径最好…

hiveserver负载均衡配置

一.安装nginx 参数我的另一篇文章:https://mp.csdn.net/mp_blog/creation/editor/135152478 二.配置nginx服务参数 worker_processes 1; events { worker_connections 1024; } stream { upstream hiveserver2 { # least_conn; # 使用最少连接路由…

八大排序算法@直接插入排序(C语言版本)

目录 直接插入排序概念算法思想代码实现核心算法:直接插入排序的算法实现: 特性总结 直接插入排序 概念 算法思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新…

【Spring实战】配置多数据源

文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍,我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中,…

文档 - - - Docsify文档创建

目录 1. Docsify 介绍2. 创建 Docsify 项目2.1 安装 Node.js2.1 安装 docsfiy-cli2.3 初始化项目2.4 运行项目2.5 使用 Python 运行项目(扩展,不推荐有bug) 3. 配置 Docsify 项目3.1 修改等待加载文字3.2 添加网站 ico 图标3.3 创建新页面写文…

python 用OpenCV 将图片转视频

import os import cv2 import numpy as npcv2.VideoWriter()参数 cv2.VideoWriter() 是 OpenCV 中用于创建视频文件的类。它的参数如下: filename:保存视频的文件名。 fourcc:指定视频编解码器的 FourCC 代码&#xf…

SVM —— 代码实现

SMO 算法的实现步骤: 代码如下: import numpy as np import matplotlib.pyplot as plt import seaborn as sns import random# 设置中文字体为宋体,英文字体为 times new roman sns.set(font"SimSun", style"ticks", fo…

webpack学习-7.创建库

webpack学习-7.创建库 1.暴露库1.1概念1.2验证1.2.1 不导出方法1.2.2 导出方法 2.外部化 lodash3.外部化的限制4.最终步骤5.使用自己的库5.1坑 6.总结 1.暴露库 这个模块学习有点坑。看名字就是把自己写的个包传到npm,而且还要在项目中使用到它,支持各种…

java类和对象的思想概述

0.面向对象Object OOP——名人名言:类是写出来的,对象是new出来的 **> 学习面向对象的三条路线 java类以及类成员:(重点)类成员——属性、方法、构造器、(熟悉)代码块、内部类面向对象特征&…

在Next.js和React中搭建Cesium项目

在Next.js和React中搭建Cesium项目,需要确保Cesium能够与服务端渲染(SSR)兼容,因为Next.js默认是SSR的。Cesium是一个基于WebGL的地理信息可视化库,通常用于在网页中展示三维地球或地图。下面是一个基本的步骤,用于在Next.js项目中…

VideoPoet: Google的一种用于零样本视频生成的大型语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

SpringCloud Alibaba(itheima)

SpringCloud Alibaba 第一章 微服务介绍1.1系统架构演变1.1.1单体应用架构1.1.2垂直应用架构1.1.3分布式架构1.1.4 SOA架构1.1.5微服务架构 1.2微服务架构介绍1.2.1微服务架构的常见问题1.2.2微服务架构的常见概念1.2.3微服务架构的常见解决方案 1.3 SpringCloud Alibaba介绍1.…

【clickhouse】在CentOS中离线安装clickhouse

一、下载地址 通过以下链接进行rpm安装包的下载 https://packages.clickhouse.com/rpm/stable/ 根据需求下载对应版本 注意:ClickHouse 20.8.2.3版本新增加了 MaterializeMySQL 的 database 引擎,该 database 能映射到 MySQL 中的某个 database&#…

iOS 开发设计 App 上架符合要求的截图

1. 真机运行截屏 2. 可以在 Apple developer 官网 Design 下找到 iPhone 边框 https://developer.apple.com/design/resources/ 不用这个边框也行,可以参考已上架 App 的图片框 3. 使用 Procreate(PhotoShop)创建符合要求的画布大小 4. 导入…

编译原理----算符优先级的分析(自底向上)

自底向上分析的分类如下所示: 算符优先分析 算符优先分析只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。 (一)若有文法G,如果G没有形如A->..BC..的产生式,其中B和C为非终结符&#xff…

Docker——微服务的部署

Docker——微服务的部署 文章目录 Docker——微服务的部署初识DockerDocker与虚拟机Docker架构安装DockerCentOS安装Docker卸载(可选)安装docker启动docker配置镜像加速 Docker的基本操作Docker的基本操作——镜像Docker基本操作——容器Docker基本操作—…

【【C++11特性篇】【强制/禁止 】生成默认函数的关键字default&delete(代码演示)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Linux》…

RocketMQ系统性学习-RocketMQ高级特性之消息大量堆积处理、部署架构和高可用机制

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…