1.3Java对象和类

Java作为一种面向对象语言。支持以下基本概念:

  • 多态
  • 继承
  • 封装
  • 抽象
  • 对象
  • 实例
  • 方法
  • 重载

本节我们重点研究对象和类的概念。

  • 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
  • :类是一个模板,它描述一类对象的行为和状态。
    下图中男孩(boy)女孩(girl)类(class),而具体的每个人为该类的对象(object)

下图中汽车类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等。

|500


Java中的对象

现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。

拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。

对比现实对象和软件对象,它们之间十分相似。

软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。

在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。

Java 中的类

类可以看成是创建 Java 对象的模板。

通过上图创建一个简单的类来理解下 Java 中类的定义:

public class Dog {
    String breed;
    int size;
    String colour;
    int age;
 
    void eat() {
    }
 
    void run() {
    }
 
    void sleep(){
    }
 
    void name(){
    }
}

这是一个简单的Java类,名为Dog,它描述了一只狗的属性和行为。

  1. String breed;:这是一个成员变量(field),用于存储狗的品种(breed),类型为String,表示品种的名字是一个字符串。

  2. int size;:这是另一个成员变量,用于存储狗的大小(size),类型为int,可能代表狗的体重或者身高。

  3. String colour;:这是另一个成员变量,用于存储狗的颜色(colour),类型为String,表示颜色的名字是一个字符串。

  4. int age;:这是另一个成员变量,用于存储狗的年龄(age),类型为int,表示狗的年龄是一个整数。

  5. void eat() { }:这是一个方法(method),名为eat(),没有参数,返回类型为void,表示这只狗在吃东西。当前方法体为空,即没有具体的实现代码。

  6. void run() { }:这是另一个方法,名为run(),同样没有参数,返回类型为void,表示这只狗在跑步。当前方法体为空。

  7. void sleep() { }:这是另一个方法,名为sleep(),同样没有参数,返回类型为void,表示这只狗在睡觉。当前方法体为空。

  8. void name() { }:这是另一个方法,名为name(),同样没有参数,返回类型为void,表示这只狗的名字。当前方法体为空。

这个类定义了一些基本的属性(品种、大小、颜色、年龄)以及行为(吃、跑、睡觉、名字),但这些行为目前都没有具体的实现。

一个类可以包含以下类型变量:

  • 局部变量在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为static 类型

一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep() 和 name() 都是 Dog 类的方法。


构造方法

每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。

在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。

下面是一个构造方法示例:

public class Puppy{
    public Puppy(){
    }
 
    public Puppy(String name){
        // 这个构造器仅有一个参数:name
    }
}

这段代码是一个简单的Java类,名为Puppy,其中包含两个构造方法(constructor)。

  1. public Puppy():这是一个无参数的构造方法,它没有任何参数,也没有具体的实现代码。通常情况下,当你创建一个Puppy对象时,如果没有传入参数,就会调用这个构造方法。

  2. public Puppy(String name):这是一个有一个参数的构造方法,参数类型是String,参数名称是name。注释写着“这个构造器仅有一个参数:name”,这段注释说明了这个构造方法的作用。通常情况下,当你创建一个Puppy对象并传入一个String类型的参数时,就会调用这个构造方法。


创建对象

对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:

  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字 new 来创建一个对象。
  • 初始化:使用 new 创建对象时,会调用构造方法初始化对象。

下面是一个创建对象的例子:

public class Puppy{
   public Puppy(String name){
      //这个构造器仅有一个参数:name
      System.out.println("小狗的名字是 : " + name ); 
   }
   public static void main(String[] args){
      // 下面的语句将创建一个Puppy对象
      Puppy myPuppy = new Puppy( "tommy" );
   }
}

编译并运行上面的程序,会打印出下面的结果:
小狗的名字是 : tommy

这段代码定义了一个Java类Puppy,其中包含了一个构造方法和一个main方法。

  1. public Puppy(String name){...}:这是Puppy类的构造方法,它接受一个String类型的参数name,用于初始化小狗的名字。在构造方法的实现中,通过System.out.println()语句将小狗的名字打印到控制台上。
  2. public static void main(String[] args){...}:这是Java程序的入口方法main。在这个方法中,创建了一个Puppy类的对象myPuppy,并且调用了构造方法Puppy("tommy")来初始化这个对象。因为构造方法内有打印语句,所以运行程序时会输出小狗的名字:“小狗的名字是 : tommy”。

访问实例变量和方法

通过已创建的对象来访问成员变量和成员方法,如下所示:

/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();

Object referenceVariable = new Constructor();
这行代码实例化了一个对象。在Java中,通常使用关键字new来创建一个对象。Constructor()表示调用了一个构造方法来初始化对象。Object referenceVariable是声明了一个引用变量referenceVariable,类型为Object,它可以引用任何类的对象。

referenceVariable.variableName;
这行代码表示通过referenceVariable引用访问了一个类中的变量variableName。这里假设variableName是该类的一个成员变量。

referenceVariable.methodName();
这行代码表示通过referenceVariable引用调用了一个类中的方法methodName()。这里假设methodName()是该类中的一个方法。


实例

下面的例子展示如何访问实例变量和调用成员方法:

public class Puppy{
   int puppyAge;
   public Puppy(String name){
      // 这个构造器仅有一个参数:name
      System.out.println("小狗的名字是 : " + name ); 
   }
 
   public void setAge( int age ){
       puppyAge = age;
   }
 
   public int getAge( ){
       System.out.println("小狗的年龄为 : " + puppyAge ); 
       return puppyAge;
   }
 
   public static void main(String[] args){
      /* 创建对象 */
      Puppy myPuppy = new Puppy( "tommy" );
      /* 通过方法来设定age */
      myPuppy.setAge( 2 );
      /* 调用另一个方法获取age */
      myPuppy.getAge( );
      /*你也可以像下面这样访问成员变量 */
      System.out.println("变量值 : " + myPuppy.puppyAge ); 
   }
}

编译并运行上面的程序,产生如下结果:

小狗的名字是 : tommy
小狗的年龄为 : 2
变量值 : 2

这段代码定义了一个名为Puppy的Java类,描述了小狗的属性和行为。

  1. int puppyAge;:这是一个成员变量(field),用于存储小狗的年龄。

  2. public Puppy(String name){...}:这是Puppy类的构造方法,接受一个String类型的参数name,用于初始化小狗的名字。在构造方法的实现中,通过System.out.println()语句将小狗的名字打印到控制台上。

  3. public void setAge(int age){...}:这是一个公共方法,名为setAge,用于设置小狗的年龄。它接受一个int类型的参数age,并将其赋值给puppyAge成员变量。

  4. public int getAge(){...}:这是另一个公共方法,名为getAge,用于获取小狗的年龄。它没有参数,返回类型为int,并通过System.out.println()语句将小狗的年龄打印到控制台上,最后返回年龄值。

  5. public static void main(String[] args){...}:这是Java程序的入口方法main。在这个方法中,首先创建了一个Puppy类的对象myPuppy,并且调用了构造方法Puppy("tommy")来初始化这个对象,传入的参数是字符串"tommy",表示小狗的名字是"tommy"。然后通过调用setAge(2)方法设置了小狗的年龄为2,接着调用getAge()方法获取小狗的年龄并打印到控制台上。最后,通过直接访问成员变量myPuppy.puppyAge,获取并打印小狗的年龄。


源文件声明规则

在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

  • 一个源文件中只能有一个 public 类
  • 一个源文件可以有多个非 public 类
  • 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。
  • 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

类有若干种访问级别,并且类也分不同的类型:抽象类和 final 类等。这些将在访问控制章节介绍。

除了上面提到的几种类型,Java 还有一些特殊的类,如:内部类、匿名类


Java 包

包主要用来对类和接口进行分类。当开发 Java 程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。

import 语句

在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。

例如,下面的命令行将会命令编译器载入 java_installation/java/io 路径下的所有类

import java.io.*;

一个简单的例子

在该例子中,我们创建两个类:Employee 和 EmployeeTest

首先打开文本编辑器,把下面的代码粘贴进去。注意将文件保存为 Employee.java。

Employee 类有四个成员变量:name、age、designation 和 salary。该类显式声明了一个构造方法,该方法只有一个参数。

Employee.java 文件代码:

import java.io.*;
 
public class Employee{
   String name;
   int age;
   String designation;
   double salary;
   // Employee 类的构造器
   public Employee(String name){
      this.name = name;
   }
   // 设置age的值
   public void empAge(int empAge){
      age =  empAge;
   }
   /* 设置designation的值*/
   public void empDesignation(String empDesig){
      designation = empDesig;
   }
   /* 设置salary的值*/
   public void empSalary(double empSalary){
      salary = empSalary;
   }
   /* 打印信息 */
   public void printEmployee(){
      System.out.println("名字:"+ name );
      System.out.println("年龄:" + age );
      System.out.println("职位:" + designation );
      System.out.println("薪水:" + salary);
   }
}

这段代码定义了一个Java类Employee,用于表示雇员的信息。

  1. import java.io.*;:这是一个导入语句,用于导入Java的输入输出库,这里可能是为了后续的输入输出操作做准备。
  2. public class Employee { ... }:这是一个类的声明,类名为Employee
  3. 成员变量(fields):
    • String name;:用于存储雇员的名字。
    • int age;:用于存储雇员的年龄。
    • String designation;:用于存储雇员的职位。
    • double salary;:用于存储雇员的薪水。
  4. 构造方法:
    • public Employee(String name) { ... }:这是Employee类的构造方法,接受一个String类型的参数name,用于初始化雇员的名字。
  5. 成员方法(methods):
    • public void empAge(int empAge) { ... }:用于设置雇员的年龄。
    • public void empDesignation(String empDesig) { ... }:用于设置雇员的职位。
    • public void empSalary(double empSalary) { ... }:用于设置雇员的薪水。
    • public void printEmployee() { ... }:用于打印雇员的信息,包括名字、年龄、职位和薪水。
      这个类包含了一系列方法,用于设置和获取雇员的各种信息,并且有一个方法用于将雇员的信息打印出来。

empAge什么意思,为什么this.name = name这个this哪里来的,为什么成员方法括号里面有的和成员变量一样,有的不同

让我逐个解释:

  1. empAge是一个成员方法,用于设置雇员的年龄。这个方法接受一个整数参数empAge,并将其赋值给age成员变量。通常情况下,方法的命名应该能够清晰地表达其功能。在这里,empAge可能表示"雇员年龄"的缩写。

  2. 在Java中,this关键字表示当前对象的引用。在构造方法中,使用this.name = name,是为了区分成员变量name和构造方法的参数name。当参数名和成员变量名相同时,使用this可以明确指示使用的是成员变量。这样做是为了避免混淆,确保正确地初始化成员变量。

  3. 成员方法的括号里的参数是用来接收调用方法时传入的参数的。有时候参数名会和成员变量名相同,这时候可以使用this关键字来区分,以指示是成员变量还是方法参数。例如,empAge方法中的参数名和成员变量名相同,所以使用this.age来表示成员变量。而在其他方法中,参数名可能会不同于成员变量名,这时候就不需要使用this了。

public Employee(String empname){
name = empname; 
}

可以这么改


程序都是从main方法开始执行。为了能运行这个程序,必须包含main方法并且创建一个实例对象。

下面给出EmployeeTest类,该类实例化2个 Employee 类的实例,并调用方法设置变量的值。

将下面的代码保存在 EmployeeTest.java文件中。

EmployeeTest.java 文件代码:

import java.io.*;
public class EmployeeTest{
 
   public static void main(String[] args){
      /* 使用构造器创建两个对象 */
      Employee empOne = new Employee("RUNOOB1");
      Employee empTwo = new Employee("RUNOOB2");
 
      // 调用这两个对象的成员方法
      empOne.empAge(26);
      empOne.empDesignation("高级程序员");
      empOne.empSalary(1000);
      empOne.printEmployee();
 
      empTwo.empAge(21);
      empTwo.empDesignation("菜鸟程序员");
      empTwo.empSalary(500);
      empTwo.printEmployee();
   }
}

编译这两个文件并且运行 EmployeeTest 类,可以看到如下结果:

$ javac EmployeeTest.java
$ java EmployeeTest 
名字:RUNOOB1
年龄:26
职位:高级程序员
薪水:1000.0
名字:RUNOOB2
年龄:21
职位:菜鸟程序员
薪水:500.0

下面的命令行将会命令编译器载入 java_installation/java/io 路径下的所有类

import java.io.*;

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

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

相关文章

Stable Diffusion Webui--安装与使用

最近进行的课程汇报,学习了2023年的CVPR文章《DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation》,因此尝试使用了几种方法对这篇文章的工作进行了一定的复现。本文主要介绍Stable Diffusion Web UI(webui)的安装…

基于多源土地覆盖产品整合的高精度中国森林覆盖数据集

本数据集是结合多源土地覆盖产品的一致性和互补性,基于无云合成影像并结合随机森林分类模型和多级投票策略生产的一套全国范围的高精度森林覆盖数据产品。该数据产品可以提升我国森林资源监测、林业经营管理、森林碳汇计量评价等方面工作的准确性,为森林…

SSL发送邮件时如何配置客户端确保安全性?

怎么使用SSL安全协议通过AokSend发送加密的电子邮件? SSL是一种常用的加密通信协议,用于确保数据在客户端和服务器之间的安全传输。AokSend将讨论如何通过配置客户端确保SSL发送邮件的安全性,并介绍如何使用SSL安全协议通过AokSend发送加密的…

【开源】课程管理平台 JAVA+Vue.js+SpringBoot+MySQL

目录 一、项目介绍 课程管理模块 作业题目模块 考试阅卷模块 教师评价模块 部门角色菜单模块 二、项目截图 三、核心代码 一、项目介绍 Vue.jsSpringBoot前后端分离新手入门项目《课程管理平台》,包括课程管理模块、作业题目模块、考试阅卷模块、教师评价模…

docker安装ubtuntu

☆ 问题描述 纯新手在docker desktop 中安装ubuntu ★ 解决方案 1. 拉取镜像 docker pull ubuntu2.查看镜像是否拉取成功 docker images3. 运行容器 docker run -itd --name <容器名称> ubuntu4. 通过 exec 命令进入 ubuntu 容器 docker exec -it <容器名>…

Java:使用Opencv进行大图找小图

本文将介绍使用Java操作Opencv进行行大图找小图测试&#xff01; 1、OpenCV简介 OpenCV是一个开源计算机视觉库&#xff0c;提供了丰富的图像处理和计算机规觉算法。它支持多种编程语言&#xff0c;包括Java本文将介绍如何在Java中使用OpenCV进行图像处理和计算机视觉任务。 …

C++|set、map模拟实现<——红黑树

目录 一、红黑树的迭代器 1.1红黑树迭代器框架 1.2operator*() && operator->() 1.3operator() 1.4operator--() 1.5operator() && operator!() 1.6begin() && end() 二、如何用红黑树搭配map和set(仿函数) 三、红黑树封装map和set(简易版…

【蓝桥杯国赛】双指针

适用于以下的情境&#xff1a; ① 数组 / 字符串中&#xff0c;有多少个满足情况的连续区间。 ② 数组 / 字符串&#xff0c;合并。 【第十三届pythonB组试题&#xff1a;近似gcd】 1. 题目描述 2. 难度&#xff1a;⭐⭐⭐⭐ 3. 思考分析&#xff1a; 具体参考&#xff…

跟风报考PMP,我真的后悔了

真的太香吧&#xff01; 我一开始没打算报考PMP证书的&#xff0c;但是我看身边很多朋友都因为PMP证书得到了升职加薪&#xff0c;这让我实在是一整个羡慕住了&#xff0c;所以我也去报考了PMP。 报考PMP前期我做了什么&#xff1f; 由于我是零基础&#xff0c;没有什么项目…

封装uview-plus上传组件up-upload,支持v-model绑定

痛点 vue上传组件拿到了一般无法直接使用&#xff0c;需要对其上下传的接口按照业务进行处理及定制。本次拿到的uview-plus也是一样&#xff0c;对其上传组件up-upload进行封装&#xff0c;令其更方便开发 目标 封装希望达到的目标&#xff0c;就是实现v-model的绑定。令其支…

SQL 语言:基本概述和数据定义

文章目录 1. 数据库语言2. SQL 概述2.1 SQL 的特点2.2 SQL 语言支持三级模式结构2.3 SQL 的基本组成 3. 数据定义3.1 数据类型3.2 创建表3.3 修改和删除表3.4 创建和删除索引3.5 创建和删除视图 1. 数据库语言 数据结构化语言 (Structured Query Language&#xff0c;SQL)&…

Sui Nami Bags对NFT使用案例进行创新

在四月的Sui Basecamp活动中&#xff0c;与会者体验了一系列Sui技术&#xff0c;这些技术以Nami Bags的形式呈现&#xff0c;这些数字礼包里满是来自Sui生态的NFT和优惠券。通过Enoki&#xff08;Mysten Labs的新客户参与平台&#xff09;提供支持&#xff0c;即使没有加密钱包…

【设计模式深度剖析】【B】【结构型】【对比】| 主要区别包装的不同

&#x1f448;️上一篇:享元模式 回 顾&#xff1a;结构型设计模式 1.代理模式&#x1f448;️ 2.装饰器模式&#x1f448;️ 3.适配器模式&#x1f448;️ 4.组合模式&#x1f448;️ 5.桥接模式&#x1f448;️ 6.外观模式&#x1f448;️ 7.享元模式&#x…

cocos creator 3.x实现手机虚拟操作杆

简介 在许多移动游戏中&#xff0c;虚拟操纵杆是一个重要的用户界面元素&#xff0c;用于控制角色或物体的移动。本文将介绍如何在Unity中实现虚拟操纵杆&#xff0c;提供了一段用于移动控制的代码。我们将讨论不同类型的虚拟操纵杆&#xff0c;如固定和跟随&#xff0c;以及如…

SpringBootWeb 篇-深入了解 Spring 异常处理、事务管理和配置文件参数配置化、yml 配置文件

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 配置文件 1.1 yml 配置文件 1.2 参数配置化 1.2.1 使用 Value 注解注入单个配置参数 1.2.2 使用 ConfigurationProperties 注解将一组相关配置参数注入到一个类中…

大型企业用什么文件加密软件,五款适合企业的文件加密软件

大型企业在选择文件加密软件时&#xff0c;通常会倾向于那些能够提供全面数据保护、具有高度可定制性、易于管理且能适应复杂组织结构的解决方案。以下是一些适合大型企业使用的文件加密软件&#xff1a; 1.域智盾软件&#xff1a; 作为一款企业级文件加密软件&#xff0c;支持…

Linux系统Mysql 8.0版本的安装

一、MySQL介绍 1.1 MySQL简介 1.2 MySQL特点 二、卸载mariadb数据库 2.1 卸载mariadb数据库 2.2 卸载mysql数据库 三、配置yum仓库 3.1 下载rpm文件 3.2 配置yum仓库 3.3 启动mysql服务 3.4 检查mysql服务状态 四、mysql的初始配置 4.1 获取登录密码 4.2 本地登录…

二叉树链式结构的前序、中序、后序、层序遍历

文章目录 一、二叉树创建二、前序遍历概念以及解释代码 三、中序遍历概念及解释代码 四、后序遍历概念及解释代码 五、层序遍历概念及解释代码 一、二叉树创建 &mesp; 实现二叉树的遍历&#xff0c;我们要先手搓出一个二叉树&#xff0c;在次基础上实现二叉树的前序、中序…

清洁力强的洗地机前十名排行榜:2024十大洗地机热销款式好用不踩雷

如今&#xff0c;洗地机行业竞争激烈&#xff0c;各品牌紧紧抓住用户对智能化和深度清洁的需求&#xff0c;深入研究创新。经过几轮行业内部的激烈竞争后&#xff0c;许多厂商在宣传中各说各的&#xff0c;对洗地机的重要参数描述不一&#xff0c;给消费者的选择带来了不少困惑…

深度学习-02-创建变量的函数

深度学习-02-创建变量的函数 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xff0…