4.类,方法,对象

1.1.2. 面向对象程序设计的三大特征

1.1.2.1. 封装

面向对象编程核心思想之一就是将数据和对数据的操作封装在一起,形成一般的概念,比如类的概念。

1.1.2.2. 继承

继承体现了一种先进的编程模式。子类可以继承父类的属性和方法。

1.1.2.3. 多态

多态是面向对象编程的又一重要特征,是编写出易维护,易扩展程序的保障。

1.1.3. 类与对象的概念

1.1.3.1.类

是一个模板或蓝图,它用来定义对象的数据域是什么以及方法是做什么的对象是类的一个实例(instance)。可以用一个类创建多个实例。创建实例的过程称为实例化(instantiation)。

对象实例(instance)是一个概念,对象是类实例化的结果。

类和对象是抽象和具体的关系。比如汽车属于交通工具类,问界 M7 是交通工具类的一个实例

1.1.3.2.对象 

对象的两方面的特征

  • 状态:描述对象的静态特征
  • 行为:描述对象的动态特征

一辆汽车

  • 状态描述:生产厂家、颜色、出厂年份、价格等
  • 行为描述:启动、加速、转弯和停止等

一名员工:

  • 状态描述:姓名、年龄、工资
  • 行为描述:说话、工作、计算工资等
1.1.3.3. 消息和方法

对象和对象之间的联系是通过消息传递的,一个对象发送消息包含 3 方面的内容:接收消息的对象,接收对象采用的方法、以及方法的参数。

 

1.2.1. 类的定义

类(class)是一种抽象数据类型,类是构成Java程序的最基本的要素,一个Java项目应由若干类构成。

1.2.1.1. 类声明

类的定义包含两部分:类的声明和类的实现(类的主体)。主体部分包含声明数据成员定义成员方法。具体格式如下:

[public][abstract|final]class ClassName [extends SuperClass] [implements InterfaceList]{//1.成员变量的定义//2.构造方法的定义//3.成员方法的定义...
}

说明:

  1. 类的修饰符

类的访问修饰符可以是 public 或者缺省。若类用 public 修饰,则该类称为公共类。公共类可以被任何包的类使用。如果不加 public 修饰符,类只能被同一包的其他类使用。如果类使用 abstract 修饰符,则该类为抽象类。如果类使用 final 修饰,指明该类为最终类。

  1. extends SuperClass

如果一个类需要继承某个类使用 extends 指明该类的父类,SuperClass 为父类名,即定义了该类继承了哪个类。如果定义类的时候没有指明所继承的父类,则它自动继承自 Object 类

  1. implements InterfaceList

如果定义的类需要实现接口,则使用 implements InterfaceList 选项。一个类可以同时实现一个或一个以上的接口,如果实现多个接口,则接口名中间以逗号分开。

  1. 类体

类声明结束后是一对大括号{},用大括号括起来的部分称为类体。类体中通常包括 三部分内容:构造方法、成员变量、成员方法。其中构造方法用于创建类实例;成员变量定义对象状态;成员方法定义对象行为

public class Employee {//3个成员变量的定义String name;int age;double salary;//无参数构造方法public Employee() {}//一个实例方法public void sayHello() {System.out.println("My name is " + name);}//另一个实例方法public double computeSalary(int hours, double rate) {double totalSalary = salary + hours * rate;return totalSalary;}
}
1.2.1.2. 成员变量的定义

成员变量的声明格式是:

[public|private|protected][static][final] type variableName[=value];

注意:

用 protected 修饰的变量为保护变量,可以被同一个包中的类或子类访问;

没有使用访问修饰符的变量,只能被同一个包中的类访问;

用 private 修饰的变量称为私有变量,只能被同一个类的方法访问。 

实例变量和静态变量。如果变量用 static 修饰,则该变量称为静态变量,又称为类变量。没有用 static 修饰的变量称为实例变量

使用 final 修饰的变量称为最终变量,又称为常量。常量可以在声明的时候赋值,也可以在后面赋初值。一旦为其赋值,其值不能更改。

 

1.2.1.3. 构造方法的定义

构造方法又称为构造器(constructor),是类的一种特殊的方法。Java 中的每个类都有构造方法,它的作用是创建对象并初始化对象的状态。下面的代码定义了一个不带参数的构造方法。

public Employee();//不带参数的构造方法,方法体为空	
1.2.1.4. 成员方法的定义

方法用来实现对象的动态特征,Java 的方法必须定义在类体内,不能定义在类体外。

成员方法的定义包括方法的声明方法体的定义,一般格式如下:

[修饰符] returnType methodName([paramList]){//方法体
}

 1.2.2. 创建和使用对象

一般先根据需求设计(创建)类(Employee),然后在另一个类(EmployeeDemo) 中,创建该Employee 类的成员并调用Employee 类的方法。

现在创建一个Employee 类的对象,实例化,并调用该实例的变量和方法。

public class EmployeeDemo {public static void main(String[] args) {//声明并创建一个Employee对象Employee employee;employee = new Employee();//访问对象的成员(赋值)employee.name = "张三";employee.age = 28;employee.salary = 5000.00;//访问对象的成员(取值)System.out.println("姓名=" + employee.name);System.out.println("年龄=" + employee.age);System.out.println("工资=" + employee.salary);//调用对象的方法employee.sayHello();}
}
/*
姓名=张三
年龄=28
工资=5000.0
My name is 张三
*/
1.2.2.1. 用 new 创建对象

为了使用对象,一般要声明一个对象名,即声明该对象的引用(reference),然后使用 new 运算符调用类的构造方法创建对象。对象声明格式如下:

1.可以同时声明多个同类型的对象名,其中用逗号分隔

Employee emp1,emp2;

 2.可以将对象的声明和创建使用一个语句完成

Employee employee;
employee=new Employee();
//(1)+(2)等价于(4)
Employee employee=new Employee();

3.若对象仅在创建处使用,也可以不声明引用名,如下面语句直接创建一个Employee对象,然后调用其sayHello()方法

new Employee().sayHello();
1.2.2.2. 对象的使用 

创建一个对象引用后,可以通过点号运算符(.)来访问对象的成员变量和调用对象的成员方法

employee.name = "张三";
employee.sayHello();
1.2.2.3. 对象引用赋值 

对于对象的赋值,赋值时将该对象的引用(地址)赋值给变量

Employee employee1,employee2;
employee1 = new Employee();
employee2=employee1;	//employee1的引用赋值给employee2
public class Employee {String name;public static void main(String[] args){Employee employee1,employee2;employee1 = new Employee();employee2 = employee1;employee1.name = "张三";employee2.name = "李四";System.out.println("employee1.name=" + employee1.name);System.out.println("employee2.name=" + employee2.name);}
}
/*
employee1.name=李四
employee2.name=李四
*/

注意:employee1 和 employee2 指向同一个对象后不管后加入什么值两个对象最终都指向最后一个值 。

 

1.2.3. 构造方法

每个类都有构造方法(constructor),构造方法用来创建类的对象或实例。构造方法也有名称、参数和方法体。

构造方法与普通方法的区别是:

  1. 构造方法的名称必须与类名相同
  2. 构造方法不能有返回值,也不能返回void
  3. 构造方法必须在创建对象时用new运算符调用

构造方法定义的格式为:

[public|protected|private] ClassName([param list]) {// 方法体
}

注意:

  1. public、protected和private为构造方法的访问修饰符,它用来决定哪些类可以使用该构造方法创建对象
  2. 构造方法名必须与类名相同
  3. 构造方法可以带有参数
  4. 构造方法可以不唯一

 

构造方法主要作用是创建对象并初始化类的成员变量。对类的成员变量,若声明时和在构造方法都没有初始化,新建对象的成员变量值都被赋予默认值。

对于不同类型的成员变量,其默认值整理如下:

  • 整型数据的默认值是0
  • 浮点型数据默认值是0.0
  • 字符型数据默认值是’\u0000’
  • 布尔型数据默认值是false
  • 引用类型数据默认值是null

例如,假设在Employee类定义了一个构造方法Employee (String name, int age, double salary),现在要定义一个无参数的构造方法,可以在下面的构造方法中调用该构造方法。

public Employee(){this("张三", 28, 5000);
}

Java语言规定:

1、在构造方法中调用另一个构造方法,则this语句必须是第一条语句

2、this只能用在实例方法和构造方法中,不能用在static方法中

1.3.1. 静态变量

静态变量和实例变量的区别是:

实例变量具有自己的内存区域,因此这些实例变量是不同的,通常使用实例变量名的方式来访问;

静态变量共享同一个内存区域,每个对象对静态变量的修改都会影响到其他对象,通常使用类名+静态变量名的方式访问。

public class Person {String name;int age;static String schoolName;public Person(String name,int age){this.name=name;this.age=age;}public void say(){System.out.println("我是"+this.name+",今年"+this.age+",来自"+this.schoolName);}public void setSchoolName(String schoolName){this.schoolName=schoolName;}
}
public class PersonDemo {public static void main(String[] args){Person.schoolName="A大学";Person p1=new Person("张三",18);Person p2=new Person("李四",28);p1.setSchoolName("B大学");p2.say();			//output}
}

另外,static与final一起使用来定义类常量。例如,Java类库中的Math类中就定义了两个类常量:

public static final double E = 2.718281828459045 ;              
public static final double PI = 3.141592653589793 ; 

 可以通过类名直接使用这些常量:

System.out.println("面积=" + Math.PI * 10 * 10);

1.3.2. 静态方法

静态方法只能访问静态变量,不允许访问实例变量,静态方法不允许使用 thissuper 等关键字。通常,通过类名+静态方法名的方式来访问静态方法。

1.2.4.2. 方法重载

一个类中定义多个同名的方法,这称为方法重载(overloading),实现方法重载,要求同名的方法。

  1. 要么参数个数不同
  2. 要么参数类型不同
  3. 仅返回值不同不能区分重载的方法
public void display (int a){System.out.println("a = "+a);	
}
public void display (double d){System.out.println("d = "+d);	
}	
public void display(){System.out.println("无参数方法");	
}	
public void display(int a,int b){System.out.println("a = "+a+",b = "+b);	
}
 public static void main(String[] args){OverloadDemo obj = new OverloadDemo();obj.display();obj.display(10);obj.display(50,60);obj.display(100.0);
}

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

安装 Nuxt.js 的步骤和注意事项

title: 安装 Nuxt.js 的步骤和注意事项 date: 2024/6/17 updated: 2024/6/17 author: cmdragon excerpt: Nuxt.js在Vue.js基础上提供的服务器端渲染框架优势,包括提高开发效率、代码维护性和应用性能。指南详细说明了从环境准备、Nuxt.js安装配置到进阶部署技巧&…

【S32K 进阶之旅】 将 EB 配置生成的 MCAL 代码集成到 S32DS 中

本文介绍如何使用 S32DS 进行 AUTOSAR MCAL 工程的编译和调试,重点在于将 EB 配置生成的 MCAL 代码集成到 S32DS 中。 虽然配置过程较为繁琐,实操过一遍就会熟悉整个工程的框架。以后每次在 EB 中更新配置,生成代码的文件夹已经集成在 S32DS…

ROS系统中解析通过CAN协议传输的超声波传感器数据

CAN Bus接口设置:确保你的ROS系统可以通过CAN Bus接口与外部设备通信。这可能需要CAN卡或CAN适配器,以及相应的驱动程序和库。 CAN消息接收:配置ROS节点来监听特定的CAN ID,这通常是超声波传感器的标识符。 数据解析&#xff1a…

jvm必知必会-类的生命周期图文详解

类的生命周期描述了一个从加载、使用到卸载的过程; 而其中的 连接 部分又分为一下三个阶段: 验证准备解析6.1 加载阶段 Loading阶段第一步是 类加载器 会根据类全限定名通过不同的渠道以二进制流的方式获取字节码信息,程序员可以使用Java代码扩展不同的渠道。 比如通过 …

003 gitee怎样将默认的私有仓库变成公开仓库

先点击“管理”, 再点击“基本信息” 在“是否开源”里, 选择:开源

重学java 71.网络编程

人生不是坐等暴风雨过去,而是学会在雨中起舞 —— 24.6.14 一、网络编程的基础概念 1.概述: 在网络通信协议下,不同计算机上运行的程序,进行数据传输 比如:通信、视频通话、网络、邮件 只要是计算机之间通过网络进行数据传输,就有…

OpenGL3.3_C++_Windows(11)

git submodule项目子模块 Git Submodule (子模块的代码并不直接存储在父仓库中,而是通过一个指针来维护)克隆含有子模块的仓库时,使用git管理Git Clone (复制一份完整的Git仓库到本地)若仓库包含子模块&am…

vivado PIN

描述 引脚是基元或层次单元上的逻辑连接点。引脚允许 要抽象掉单元格的内容,并简化逻辑以便于使用。引脚可以 是标量的,包含单个连接,或者可以定义为对多个进行分组的总线引脚 信号在一起。 相关对象 引脚连接到一个单元,并且可以…

韩兴国/姜勇团队在《Trends in Plant Science》发表植物根系氮素再分配的观点文章!

氮素是陆地生态系统中的关键限制性营养元素,通过生物固氮和土壤氮供应通常远低高等植物的氮需求。当土壤氮素供应无法充分满足植物茎叶生长需求时,植物会通过自身营养器官(如根或根茎)再分配来实现氮的内部循环和再利用。尽管植物…

Docker部署Nginx下载站点服务

1、下载镜像 由于docker官方镜像站点被封了,所以我把镜像上传到阿里云镜像仓库了 docker pull registry.cn-hangzhou.aliyuncs.com/qinzt-tools/file-nginx:1.18.02、运行容器实例 运行变量解释: 变量名称默认值解释USERhyadmin访问下载站点的认证用…

第2章 Rust初体验4/8:提供标准库之外功能的Library Crate:简化包管理和依赖管理:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.4 故事2: 生成点数之和的随机答案 又是新的一天,大家的培训课又开始了哦!现在,我们的学员们开始用三种语言来实现故事2,加油! 2.4.1 Rust版故事2 2.4.1.1 提供标准库之外功能的Library Crate:简化包管理和依赖管理 贾克强:“我们的故事…

中电金信:银行业数据中心何去何从

20多年前,计算机走进国内大众视野,计算机行业迎来在国内的高速发展时代。银行业是最早使用计算机的行业之一,也是计算机技术应用最广泛、最深入的行业之一。近年来,随着银行竞争加剧,科技如何引领业务、金融科技如何发…

26 岁的“天才少年”,带队面壁打通高效大模型之路

每一轮技术浪潮出现时,冲在最前面的都是朝气蓬勃的年轻人。 当大模型代表的人工智能浪潮席卷全球,作为移动互联网“原住民”的年轻开发者,可以说是最活跃的群体。他们的脸庞还有些稚嫩,但在技术和方向上有着自己的想法&#xff0…

一些激活函数

一些激活函数 摘要激活函数分类sigmoidTanhSoftsignSoftmaxReLUSoftplusNoisy ReLULeaky ReLUPReluELUSELUSwishGELUGLUGEGLUMishMaxout 摘要 本篇博客对一些激活函数进行总结,以便加深理解和记忆 激活函数分类 饱和激活函数:sigmoid、tanh… 非饱和激…

Anritsu 安立 MS2720T 手持式频谱分析仪

Anritsu 安立 MS2720T 手持式频谱分析仪 频谱分析仪功能特点 频率范围: 9 kHz ~ 9 GHz、13 GHz 和 20 GHz测量: 占用的带宽、信道功率、ACPR、C/I、发射波罩、杂散发射、场强适用于 LTE(FDD & TDD)、CDMA、W-CDMA、WiMAX、GSM 和 TD-SCDMA 的 3G 和…

代码随想录算法训练营第二十六天|39. 组合总和、 40.组合总和II、 131.分割回文串

39. 组合总和 题目链接:39. 组合总和 文档讲解:代码随想录 状态:卡了一会儿 思路:先排序,方便剪枝。允许数字重复使用,因此递归调用时传入当前索引i。 题解: public class Solution {// 用于存…

深度学习训练——batch_size参数设置过大反而训练更耗时的原因分析

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《暗光增强》 &a…

长短期记忆神经网络(LSTM)的回归预测(免费完整源代码)【MATLAB】

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊类型的递归神经网络(RNN),专门用于处理和预测基于时间序列的数据。与传统RNN相比,LSTM在处理长期依赖问题时具有显著优势。 LSTM的基本…

FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析

一、av_malloc函数分析 (一)av_malloc函数的声明 av_malloc函数的声明放在在FFmpeg源码(本文演示用的FFmpeg源码版本为5.0.3,该ffmpeg在CentOS 7.5上通过10.2.1版本的gcc编译)的头文件libavutil/mem.h中:…

Ubuntu网络管理命令:ifconfig

安装Ubuntu桌面系统(虚拟机)_虚拟机安装ubuntu桌面版-CSDN博客 关于ifconfig命令,在11.1节已经介绍过了。通过该命令可以查看和配置网络接口。ifconfig是一个比较古老的命令,在Ubuntu 22以及其他的许多发行版中,已经不…