4.类,方法,对象

news2024/11/26 23:44:48

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.coloradmin.cn/o/1832420.html

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

相关文章

CMake从安装到精通

目录 引言 1. CMake的安装 2. CMake的原理 3. CMake入门 3.1 CMakeLists.txt与注释 3.2 版本指定与工程描述 3.3 生成可执行程序 3.4 定义变量与指定输出路径 3.5 指定C标准 3.6 搜索文件 3.7 包含头文件 4. CMake进阶 4.1 生成动静态库 4.2 链接动静态库 4.…

【图像分割】DSNet: A Novel Way to Use Atrous Convolutions in Semantic Segmentation

DSNet: A Novel Way to Use Atrous Convolutions in Semantic Segmentation 论文链接:http://arxiv.org/abs/2406.03702 代码链接:https://github.com/takaniwa/DSNet 一、摘要 重新审视了现代卷积神经网络(CNNs)中的atrous卷积…

计算机组成原理(四)Cache存储器

文章目录 Cache存储器的基本原理cache命中率、平均访问时间、效率地址映射全相联映射直接映射组相联映射 查找算法cache 存储器替换策略cache 存储器-写操作策略习题 Cache存储器的基本原理 Cache是一种高速缓冲寄存器,是为了解决CPU和主存之间速度不匹配而采用的一…

检索增强生成(RAG)的挑战与优化措施

如何理解检索增强生成(RAG) 简单来说,RAG就是让LLM通过外部知识源获取额外信息,从而生成更准确、更符合上下文的答案,并减少错误信息(或称为“幻觉”)的产生。 我们都知道,最先进的…

计数排序(Counting Sort)

计数排序(Counting Sort) 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法。排序思路: 1.找出待排序数组最大值2.定义一个索引最大…

Python学习打卡:day08

day8 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day858、数据容器(序列)的切片序列的常用操作——切片 59、序列的切片课后练习60、集合的定义和操作集合的定义集合的操作添加新元素移除元素从集合…

NATAPP-内网穿透工具----下载与配置

NATAPP-内网穿透工具 基于ngrok的国内高速内网穿透服务,natapp提供了一种便利的方式,使得开发和测试过程更加高效,尤其是在需要进行远程调试或展示时。无论是进行web开发、微信和支付宝的本地开发调试,还是简单地从外部网络访问家…

如何根据使用场景选购3D扫描仪?

三维扫描建模是指通过专业的三维扫描仪对产品进行三维数据的采集,快速获取物体精确的3D数据,实现1:1复刻原物体,扫描后所得的数字化3D模型以obj、fbx、glb、gltf等格式保存。 积木易搭自主研发多款三维扫描设备,拥有多项国家专利&…

初学者必看的web前端开发学习路线,干货满满!

初学者必看的web前端开发学习路线,干货满满! 随着互联网的深入发展,前端工程师这个岗位在市场上的需求,薪资也是很可观的。前端很火,想自学前端的人也很多。包括一些学生、上班族、以前的UI,java,或完全零基础&#xf…

Nginx 高级应用

目录 一.使用alias实现虚拟目录 二. 通过stub_status模块监控nginx的工作状态 三. 使用limit_rate限制客户端传输数据的速度 四. nginx虚拟主机配置 1.基于端口的虚拟主机 2. 基于IP的虚拟主机 3. 基于域名的虚拟主机 nginx配置文件: /…

3阶段提交协议(3pc)

3阶段提交协议(3pc) 1 简介 三阶段提交协议是一个强一致、中心化的原子提交协议。解决了分布式事务、副本容错等分布式问题。其核心思想是将2PC的二阶段提交协议的“准备阶段”一分为二,形成了由CanCommit、PreCommit、DoCommit三个阶段组成…

LWIP移植

目录 前言一、以太网协议简介1.1 TCP/IP协议简介1.2 STM32的ETH外设1.2.1 MAC子层1.2.2 SMI站管理接口1.2.3 MII和RMII接口 1.3 外部PHY芯片LAN87201.3.1 LAN8720 中断管理1.3.2 PHY 地址设置1.3.3 nINT/REFCLKO 配置1.3.4 LAN8720 内部寄存器 1.4 LWIP 简介 二、带操作系统的移…

【热】大数据信用报告查询平台哪个比较好?这个平台值得一试!

在当今数字化时代,大数据技术的发展为个人和企业提供了更便捷、精准的信用报告查询服务。选择一个优秀的大数据信用报告查询平台至关重要,它直接影响到您获取信用信息的准确性和全面性。 首先,选择大数据信用报告查询平台时,您可以…

Flutter图像编辑器应用:创造生动美丽的照片体验

介绍 引言 想象一下,在一个阳光明媚的下午,与家人或朋友漫步在风景如画的街道上。拿出手机,迫不及待地捕捉这一刻的美好,按下快门,留下了一张充满回忆的照片。 然而,回到家后发现照片的亮度有些偏暗&…

大模型应用开发技术:Multi-Agent框架流程、源码及案例实战(二)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

c函数/2024/6/17

1.递归计算0--n的和 #include <stdio.h> int sum(int n);//递归求和函数 int main(int argc, const char *argv[]) {//(2)递归计算0--n的和int n0;printf("请输入n的值为:");scanf("%d",&n);printf("0--n的和为:%d",sum(n));return 0…

CTFshow之RCE代码命令远程执行第41关到第52关详细讲解。可私信!

与其抱怨自己&#xff0c;不如埋怨他人。 --莫迪大仙 引言&#xff1a;今天来到ctf赛题RCE专题第二天&#xff08;今天肯定写不完了啊啊啊啊啊&#xff09;&#xff0c;不过继续加油&#xff01; 一、实验准备 1、ctf网址 2、firefox浏览器、hackbar插件 二、实验过程 &a…

大数据分析-二手车用户数据可视化分析

项目背景 在当今的大数据时代&#xff0c;数据可视化扮演着至关重要的角色。随着信息的爆炸式增长&#xff0c;我们面临着前所未有的数据挑战。这些数据可能来自社交媒体、商业交易、科学研究、医疗记录等各个领域&#xff0c;它们庞大而复杂&#xff0c;难以通过传统的数据处…

Day 25:1807. 替换字符串中的括号内容

Leetcode 1807. 替换字符串中的括号内容 给你一个字符串 s &#xff0c;它包含一些括号对&#xff0c;每个括号中包含一个 非空 的键。 比方说&#xff0c;字符串 “(name)is(age)yearsold” 中&#xff0c;有 两个 括号对&#xff0c;分别包含键 “name” 和 “age” 。 你知道…

Linux:生产消费模型 读者写者模型

Linux&#xff1a;生产消费模型 & 读者写者模型 生产消费模型阻塞队列基本结构构造与析构投放任务获取任务总代码 POSIX 信号量基本概念接口 环形队列基本结构构造与析构投放任务获取任务总代码 读者写者模型读写锁 生产消费模型 生产消费模型是一种用于处理多线程之间任务…