Java 面向对象(类与对象 成员方法 方法重载 可变参数 构造方法 / 构造器 this关键字 包 访问修饰符)

目录

  • 一、类与对象
    • 1. 类与对象的定义
    • 2. 类和对象的内存分配机制
  • 二、成员方法
    • 1. 成员方法的定义
    • 2. 方法的调用机制
    • 3. 成员方法传参机制
  • 三、方法重载
  • 四、可变参数
    • 1. 基本概念
    • 2. 基本语法
    • 3. 应用
  • 五、 构造方法 / 构造器
    • 1. 特点
    • 2. 使用案例
    • 3. 对象创建的流程
  • 六、this关键字
    • 1. 运用场景
    • 2. 使用案例
  • 七、包
    • 1. 包的三大作用
    • 2. 包的基本语法
    • 3. 包的本质
    • 4. 使用案例
    • 5. 包的命名规则
    • 6. 常用的包
    • 7. 引入包
    • 8. 注意事项
  • 八、访问修饰符
    • 1. 简介
    • 2. 访问范围
    • 3. 注意事项


一、类与对象

1. 类与对象的定义

类(Class)

  • 类是Java中的基本构造单元,用于定义对象的属性和行为。
  • 类通过关键字 class 定义,然后包含类的名称以及类体中的属性和方法。
  • 一个类可以包含零个或多个属性(成员变量)方法(成员函数)
class Car {// 属性String brand;String color;int maxSpeed;// 方法void drive() {System.out.println("Driving at max speed: " + maxSpeed);}
}

对象(Object):

  • 对象是类的实例,即类的具体实现。
  • 使用 new 关键字创建类的对象,然后通过对象访问其属性和方法。
public class Main {public static void main(String[] args) {// 创建Car类的对象Car myCar = new Car();// 设置对象的属性myCar.brand = "Toyota";myCar.color = "Red";myCar.maxSpeed = 200;// 访问对象的方法myCar.drive();}
}

关系:

  • 类定义了对象的结构和行为,对象是类的实例,具有类定义的属性和方法。
  • 一个类可以有多个对象实例。
  • 类可以继承自其他类,从而形成父子关系,子类可以继承父类的属性和方法,并且可以添加自己的属性和方法。

2. 类和对象的内存分配机制

  • Java 内存的结构分析
    1. 栈:一般存放基本数据类型(局部变量)。
    2. 堆:存放对象(Car myCar,数组等)。
    3. 方法区:常量池(常量,比如字符串),类加载信。

Person p = new Person();
p.name = "小明";
p.age = 1
  • Java 创建对象的流程
    1. 先加载 Person 类信息(属性和方法信息, 只会加载一次)
    2. 在堆中分配空间, 进行默认初始化(看规则)
    3. 把地址赋给 p p p p p p 就指向对象

在这里插入图片描述


二、成员方法

1. 成员方法的定义

访问修饰符 返回数据类型 方法名(形参列表..{//方法体语句;return 返回值;
}
  1. 形参列表:表示成员方法输入 cal(int n) , getSum(int num1, int mum2)
  2. 返回数据类型:表示成员方法输出, void 表示没有返回值。
  3. 方法主体:表示为了实现某一功能代码块。

2. 方法的调用机制

在这里插入图片描述


3. 成员方法传参机制

在这里插入图片描述

C++有指针和引用可以直接进行对原始数据的修改,而Java由于引用类型属于类,所以得通过类的成员方法对原始数据进行修改。

Java中的方法参数传递机制主要有两种:

按值传递(Pass by Value)(与C++相同):

  • 对于基本数据类型(如 int、double、char 等),方法参数的传递是按值传递的。
  • 在方法调用时,传递给方法的是实参的值的拷贝,而不是实参本身
  • 在方法内部对参数的修改不会影响到原始数据。
public class PassByValueExample {public static void main(String[] args) {int x = 10;System.out.println("Before method call: " + x); // 输出 10changeValue(x);System.out.println("After method call: " + x); // 输出 10}static void changeValue(int num) {num = 20; // 修改参数的值}
}

按引用传递(Pass by Reference)的模拟:

  • 对于对象类型(如类实例),方法参数的传递在表面上看起来是按引用传递的。
  • 但实际上,Java 中的对象参数传递是通过将对象的引用(地址)传递给方法,而不是对象本身。
  • 这意味着在方法中对对象属性的修改会影响原始对象。
class Person {String name;Person(String name) {this.name = name;}
}public class PassByReferenceExample {public static void main(String[] args) {Person person = new Person("Alice");System.out.println("Before method call: " + person.name); // 输出 AlicechangeName(person);System.out.println("After method call: " + person.name); // 输出 Bob}static void changeName(Person p) {p.name = "Bob"; // 修改对象属性}
}

三、方法重载

与C++一致

案例:类:MyCalculator 方法:calculate
1) calculate(int n1, int n2) //两个整数的和
2) calculate(int n1, double n2) //一个整数,一个 double 的和
3) calculate(double n2, int n1)//一个 double ,一个 Int 和
4) calculate(int n1, int n2,int n3)//三个 int 的和

注意事项和使用细节:

  1. 方法名:必须相同。
  2. 形参列表:必须不同(形参类型或个数或顺序,至少有一样不同,参数名无要求)。
  3. 返回类型:无要求。

四、可变参数

1. 基本概念

通过可变参数 Java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。


2. 基本语法

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

可以将对应数据类型的数组传入方法的形参中


3. 应用

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;
}
public class VarArgsExample {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};double[] doubles = {1.1, 2.2, 3.3, 4.4, 5.5};// 调用方法,传递数组给可变参数printNumbers(numbers);printDoubles(doubles);}// 方法接受可变参数static void printNumbers(int... nums) {System.out.print("Numbers: ");for (int num : nums) {System.out.print(num + " ");}System.out.println();}// 同样的方法接受可变参数static void printDoubles(double... nums) {System.out.print("Doubles: ");for (double num : nums) {System.out.print(num + " ");}System.out.println();}
}

五、 构造方法 / 构造器

与C++类似

1. 特点

  1. 方法名和类名相同
  2. 没有返回值
  3. 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化。

2. 使用案例

public class Car {// 属性String brand;String color;int maxSpeed;// 构造方法public Car(String brand, String color, int maxSpeed) {this.brand = brand;this.color = color;this.maxSpeed = maxSpeed;}// 方法void drive() {System.out.println("Driving " + color + " " + brand + " at max speed: " + maxSpeed);}public static void main(String[] args) {// 创建Car类的对象,并调用构造方法进行初始化Car myCar = new Car("Toyota", "Red", 200);// 调用对象的方法myCar.drive(); // 输出 Driving Red Toyota at max speed: 200}
}

3. 对象创建的流程

在这里插入图片描述


六、this关键字

与C++的this指针一致

在Java中,this 是一个关键字,用于引用当前对象。

1. 运用场景

  1. 区分局部变量和实例变量
    当实例变量和局部变量同名时,可以使用 this 关键字来区分它们。this 引用的是当前对象的实例变量,而不是局部变量。

  2. 在构造方法中调用其他构造方法
    在一个构造方法中调用同一个类的另一个构造方法时,可以使用 this 关键字。

  3. 传递当前对象给其他方法
    可以将当前对象作为参数传递给其他方法,或者返回当前对象。

由于Java没有缺省参数 所以采用重载来达到类似效果
如下面 运用 this关键字调用另一个构造方法 来达到缺省参数的效果


2. 使用案例

public class Person {// 实例变量String name;int age;// 构造方法1:使用this关键字调用另一个构造方法public Person() {this("John", 30); // 调用另一个构造方法// 由于Java没有缺省参数 所以采用重载来达到类似效果}// 构造方法2:接受参数来初始化对象public Person(String name, int age) {this.name = name; // 使用this引用当前对象的实例变量this.age = age;   // 使用this引用当前对象的实例变量}// 方法:打印对象的信息public void display() {System.out.println("Name: " + this.name + ", Age: " + this.age);}// 方法:传递当前对象给其他方法public Person getPerson() {return this;}public static void main(String[] args) {// 创建Person对象Person person1 = new Person();person1.display(); // 输出 Name: John, Age: 30// 创建Person对象,并传递给其他方法Person person2 = new Person("Alice", 25);Person person3 = person2.getPerson();person3.display(); // 输出 Name: Alice, Age: 25}
}

七、包

1. 包的三大作用

  • 区分相同名字的类。
  • 当类很多时,可以很好的管理类。
  • 控制访问范围。

2. 包的基本语法

package com.hspedu;

说明

  1. package 关键字,表示打包。
  2. com.hspedu 表示包名。

3. 包的本质

在这里插入图片描述


4. 使用案例

在这里插入图片描述


5. 包的命名规则

在这里插入图片描述


6. 常用的包

一个包下,包含很多的类,java 中常用的包有;

1) java.lang.* //lang 包是基本包,默认引入,不需要再引入
2) java.util.* //util 包,系统提供的工具包, 工具类,使用 Scanner
3) java.net.* //网络包,网络开发。
4) java.awt.* //是做 java 的界面开发,GUI

7. 引入包

在这里插入图片描述


8. 注意事项

在这里插入图片描述

//package 的作用是声明当前类所在的包,需要放在类(或者文件)的最上面,
// 一个类中最多只有一句 packagepackage com.hspedu.pkg;//import 指令 位置放在 package 的下面,在类定义前面,可以有多句且没有顺序要求
import java.util.Scanner;
import java.util.Arrays;//...

八、访问修饰符

1. 简介

Java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):

  1. 公开级别:用 public 修饰,对外公开
  2. 受保护级别:用 protected 修饰,对子类和同一个包中的类公开
  3. 默认级别:没有修饰符号,向同一个包的类公开。
  4. 私有级别:用 private 修饰,只有类本身可以访问,不对外公开。

2. 访问范围

在这里插入图片描述


3. 注意事项

  1. 修饰符可以用来修饰类中的属性,成员方法以及类。
  2. 只有默认的和public才能修饰类,并且遵循上述访问权限的特点。
  3. 成员方法的访问规则和属性完全一样。
//com.hspedu.modifier:需要很多文件来说明(A类,B类,Test类...)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P6安装:安装P6提示1433端口无效

错误描述 尝试运行 Microsoft SQL Server 2005 的 Primavera P6 数据库时&#xff0c;遇到以下错误&#xff1a; SQLServerException: The TCP/IP connection to the host [name], port 1433 has failed. Error: “Connection refused: connect. Verify the connection prope…

MATLAB的多项式相加

多项式的加减在阶次相同的情况下可直接运算&#xff0c;若两个相加减的多项式阶次不同&#xff0c;则低阶多项式必须用零填补高阶项系数&#xff0c;使其与高阶多项式有相同的阶次。而且通常情况下&#xff0c;进行加减的两个多项 式的阶次不会相同&#xff0c;这时可以自定义一…

视频素材库大全免费无水印必备素材网站,整理分享抖音视频素材剪辑必备

想要做出容易上热门的抖音视频作品&#xff0c;你一定要找到合适的短视频剪辑素材&#xff0c;今天我就给你收集了视频素材库大全免费无水印必备素材网站&#xff0c;都给你提供了海量的短视频素材库大全免费无水印&#xff0c;从风景&#xff0c;美食&#xff0c;动漫&#xf…

从排序算法的艺术看C语言qsort函数的魅力:一场数据的时空穿越

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一 、回调函数 二、qsort函数 1.qsort函数排序整型数据 2.qsort函数排序结构数据 一 、回调函数 何为回调函数&#xff1…

基于matlab使用 fmincon 函数来进行有约束条件的最小化问题求解

一、一般步骤 生成带有噪声的正态分布数据&#xff1b;定义拟合模型。 model (params, x) normpdf(x, params(1), params(2)); 初始参数猜测 initial_guess [mu, sigma]; 设置约束条件 lb [0, 0]; % 参数的最小值 ub [10, 10]; % 参数的最大值 定义优化问题 opts …

deepseek-coder模型量化

1 简介 DeepSeek-Coder在多种编程语言和各种基准测试中取得了开源代码模型中最先进的性能。 为尝试在开发板进行部署&#xff0c;首先利用llama.cpp对其进行量化。 2 llama.cpp安装 git clone之后进入文件夹make即可&#xff0c;再将依赖补全pip install -r requirements.tx…

【吊打面试官系列】Java虚拟机JVM篇 - 关于双亲委派模型

大家好&#xff0c;我是锋哥。今天分享关于JVM双亲委派模型的JVM面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是双亲委派模型&#xff1f; 双亲委派模型针对的是 Java 虚拟机中三个类加载器的&#xff0c;这三个类加载器分别是&#xff1a; 启动类加载器&#xff08;B…

node.js快速入门-day03

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 web服务器创建…

力扣hot100:34. 在排序数组中查找元素的第一个和最后一个位置(二分查找的理解)

我们知道使用二分查找能找到值所在的位置。假如我们在找到值后仍然不断的更新指针会发生什么&#xff1f;我们可以利用这一点来找到最左边的以及最右边的值。 如果当nums[mid]target时&#xff0c;使得 rightmid-1&#xff0c;那么最终会使得target在right的右边。 如果当nums[…

海外媒体宣发套餐推广攻略实现品牌全球化-华媒舍

如今&#xff0c;在全球经济一体化的浪潮下&#xff0c;品牌全球化已成为企业成功的重要因素之一。海外市场作为一个巨大而具有潜力的机会&#xff0c;吸引着越来越多的企业前往探索。而在海外市场的推广过程中&#xff0c;海外媒体宣发套餐成为了重要的推广方式之一。本文将为…

【S5PV210_视频编解码项目】裸机开发:实现按键的外部中断处理

加粗样式本文所作内容&#xff1a; 基于S5PV210芯片实现按键的外部中断处理程序&#xff0c;搭建中断处理流程框架 S5PV210对于中断处理的操作流程 1 外部中断得到触发&#xff1a; 1&#xff09;外部中断在初始化阶段得到使能 2&#xff09;外界达到了外部中断的触发条件 …

24考研数学最大教训❗️660/880过时了?

我没看错吧&#xff0c;说660题和880题过时了&#xff1f; 660题和880题好好用&#xff0c;这俩很经典不会过时。 660题是客观题训练必刷的一本题集&#xff0c;而880是强化阶段非常好的一本综合性题集。我本身在考研的时候使用的也是这两本题集&#xff0c;所以对这两本题集…

如何学习一个大型分布式Java项目

前言 很多同学在没有实习经验的时候看到一个多模块分布式项目总是有一种老虎吃天的无力感&#xff0c;就像我刚毕业去到公司接触项目的时候一样&#xff0c;模块多的夸张&#xff0c;想学都不知道从哪开始学&#xff0c;那么我们拿到一份代码后如何从头开始学习一个新项目呢。…

Oracle Primavera Analytics 是什么,与P6的关系?

前言 Oracle Primavera P6 Analytics 是与P6有关的一个相对较新的模块&#xff0c;Primavera 用户社区在很大程度上尚未对其进行探索。 那么它到底有什么作用呢&#xff1f; 通过了解得知它旨在通过深入了解组织的项目组合绩效&#xff0c;帮助高级管理层对其项目组合做出更好…

MySQL | 库的操作 | 表的操作

目录 1. 库的操作 1.1. 创建数据库 1.2. 字符集和校验规则 1.2.1. 查看系统默认字符集以及校验规则 1.2.2. 查看数据库支持的字符集 1.2.3. 查看数据库支持的字符校验规则 2. 操作数据库 2.1. 查看数据库 2.2. 显示创建语句 2.3. 修改数据库 2.4. 数据库的删除 2.4.…

维基百科推广秘诀13个方法助你成为行业领导者-华媒舍

维基百科&#xff08;Wikipedia&#xff09;作为全球最大、最权威的在线百科全书&#xff0c;拥有海量的知识内容&#xff0c;被广大用户广泛使用。对于任何一个领域的从业者来说&#xff0c;建立自己的维基百科页面&#xff0c;无疑是提升行业影响力的重要手段。本文将向您介绍…

Linux学习(4)——使用编辑器

1.gedit编辑器 简单易懂&#xff0c;依赖图形界面。可以使用ctrlc ctrlv等快捷键&#xff0c;ctrls进行保存&#xff0c;与windows系统中相类似。 2.vi/vim编辑器 vi/vim可以直接通过控制台的终端完成文本的编辑&#xff0c;不依赖图形界面&#xff0c;使用范围更广。它的编辑…

Redis数据结构对象之字符串对象

字符串对象 字符串对象的编码可以是int、raw或者embstr 如果一个字符串对象保存的是整数值&#xff0c;并且这个整数值可以用long类型来表示&#xff0c;那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void *转换成long)&#xff0c;并且将字符串对象的编码设…

【Cute】MMA抽象代码理解 c2d9bff3d88846eb8c523fb722166bc9

【Cute】MMA抽象代码理解 导读&#xff1a; cute 之 Layoutcute Layout 的代数和几何解释cute 之 Tensorcute 之 MMA抽象cute 之 简单GEMM实现 阅读本文前建议先读上面reed大神的数篇文章&#xff0c;文本逻辑主要是针对具体的代码&#xff0c;记录一下自己学习过程中的理解…

Atlas200板卡部署车道线

本博客包含推理的准备和部署代码&#xff0c;一步步实现部署。 这个运行时生成的一个batch的数据&#xff0c;NCHW,就是输入的N&#xff0c;单图片推理就是1&#xff0c;把里面的数量改成1&#xff0c;但是你可以多生成一些bin图片放到校准文件夹中&#xff0c;更改输出文件名…