Java的类与Golang的结构体的区别

在这里插入图片描述

Java作为一门面向对象(OOP)的编程语言,它有类(class)的存在,而对于Golang,它不完全遵从OOP编程语言的设计思想,但它也有类似Java类的结构存在,那就是结构体(struct)。

这篇文章就带大家通过对比的形式来了解一下Java中的类与Golang中的结构体。通过对比讲解的好处是,能够更加透彻、深入的理解一个事物。在此,无论你的主语言是Java还是Golang,在对比的过程中都会有意外的收获的。

状态和行为的不同

在Java中,一个类同时包含状态(字段)和行为(方法)。Java类封装数据并提供操作该数据的方法。在Go中,结构体主要表示状态或数据,默认情况下不包含行为。Go中的方法是单独定义的,可以通过接收器(receiver)函数操作结构体。

Java类的实现:

public class Person {private String name;private int age;public void eat(String food){System.out.println("eat " + food);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

Golang中的实现:

type Person struct {Name stringAge  int
}func (p *Person) Eat(food string) {fmt.Println("eat", food)
}

在上述Golang代码中,Eat方法通过接收器(Person)定义了它所属的结构体。

面向对象的继承特性

Java支持类继承,一个类可以从父类继承字段和方法。而Go没有基于类的继承。它鼓励使用组合而不是继承,可以在一个结构体中嵌入另一个结构体以实现类似的功能。

在上述实例上,我们实现一个Student来“继承”Person。

Java的继承实现:

public class Student extends Person{public static void main(String[] args) {Student s = new Student();s.setName("Tom");s.setAge(20);System.out.println(s.getName() + ":" + s.getAge());s.eat("breakfast");}
}

上述代码演示了Java的集成以及使用。

Golang基于组合关系实现的类似继承功能:

type Student struct {*Person
}func main() {s := Student{&Person{Name: "Tom", Age: 20}}fmt.Println(s.Name, s.Age)s.Eat("breakfast")
}

在Golang中,通过匿名组合的形式,结构体Student拥有了Person的属性和方法调用能力。

可见性和访问控制

Java具有像public、private和protected这样的访问修饰符来控制字段和方法的可见性和访问。Go采用了更简单的方法,使用大写标识符表示公共访问,小写表示在包内的私有访问。

像eat方法,在Java中可以通过访问修饰符来进行控制:

	public void eat(String food){System.out.println("eat " + food);}private void eat(String food){System.out.println("eat " + food);}protected void eat(String food){System.out.println("eat " + food);}void eat(String food){System.out.println("eat " + food);}

而在Golang中,只有方法名首字母大写与小写两种形式:

func (p *Person) Eat(food string) {fmt.Println("eat", food)
}func (p *Person) eat(food string) {fmt.Println("eat", food)
}

首字母大写表示可公共访问的方法(或函数),首字母小写则表示只允许在包(package)级别进行访问。

区别汇总

以上实例是Java和Golang在类和结构体使用上的基本区别。下面总结一下Java的类和Golang的结构体更多的一些区别:

在Golang中,弃用了Java的继承、实现、重载等概念,进而使用组合来达到复用方法或字段的效果。

在Java中方法和函数合为一体,都是通过类来承载的,而在Golang中方法与函数是有所区分的,有接收者的成为方法,无接收者者的成为函数。

在Java中,不存在显式的指针的操作,而Golang使用 ***** 来定义和声明指针,通过**&**来取得对象的指针。

Java和Golang方法传参时传递的都是值类型,在Java中如果传递了基本类型,则会传递一个副本,方法中的操作不会改变原始的变量值;如果传递了引用类型(对象、数组等)会复制其指针进行传递, 而在Golang中必须要显式传递Person的指针,不然只是传递了该对象的一个副本。

小结

Golang作为一门比较新的语言,它在某些方面参考了传统的面向对象语言的特性,但又不完全拘泥于传统语言的实现方法。Golang还是有非常多可圈可点的地方。如果大家对Java与Golang两门语言的一些特性对比感兴趣,可多多支持,后续会写更多同类文章。

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

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

相关文章

宝塔开心版hostcli的广告去除

首先感谢hostcli把宝塔7.6剥离了,直接安装我这里是缺少pyenv的包。 直接进入正题吧。 定位到页面左下方的广告位于 /www/server/panel/BTPanel/templates/default/layout.html “退出”按钮下方有条线开始去掉 去掉之前的忘了截图了,就这样吧&#xff…

NextJS开发:使用winston记录日志

NextJs中如果使用Route Handlers来编写Restful API接口,可以使用winston来将日志存储到文件。 winston Winston是一个Node.js的日志记录库,它可以帮助开发人员记录应用程序中的重要日志信息并进行分析。Winston支持多种日志记录级别,包括调…

java 读取excel/word存入mysql

引入依赖 <!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artif…

【数据结构】反射、枚举

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 反射、枚举 1. 反射1.1 定义1.2 反射…

阿里云配置ECS实例的IPv6地址,开通公网IPv6

1.阿里云ECS服务器开通IPv6地址&#xff0c;开通公网IPv6 1.1.官网教程 配置ECS实例的IPv6地址 1.2.相关截图 1.2.1.专有网络VPC开通IPv6 1.2.2.交换机switch开通IPv6 1.2.3.开通IPv6网关并开通公网宽带 1.2.4.ECS服务器绑定IPv6网关 1.2.5.安全组开通IPv6 1.2.6.主机测试I…

【Docker】深入理解Docker:一种革新性的容器技术

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

SpringBoot3基础特性

SpringBoot3基础特性 SpringApplication 自定义banner 类路径添加banner.txt或设置spring.banner.location就可以定制banner推荐网站:Spring Boot banner在线生成工具&#xff0c;制作下载英文banner.txt,修改替换banner.txt文字实现自定义。 提示&#xff1a; 可以通过修改配…

DevEco Studio harmonyOS 模拟器 Unable to install HAXM

在Intel CPU的Windows电脑下&#xff0c;启动模拟器失败&#xff0c;提示“Unable to install HAXM.”&#xff0c;无法安装HAXM。 打开任务管理器&#xff0c;在“性能”选项&#xff0c;检查CPU虚拟化是否已经启用。如果未启用&#xff0c;需要进入电脑的BIOS中&#xff0c;将…

工商银行卡安全码怎么看

工商银行的安全码&#xff0c;作为一项至关重要的安全措施&#xff0c;旨在保护用户的银行账户和交易安全。为了查看工商银行的安全码用户需要按照以下步骤操作&#xff1a; 首先&#xff0c;用户需要使用电脑或手机访问工商银行的网上银行平台。在平台首页&#xff0c;用户需要…

『亚马逊云科技产品测评』活动征文|搭建带有“弱”图像处理功能的流媒体服务器

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 本文基于以下软硬件工具&#xff1a; aws ec2 frp-0.52.3 mediamtx-1.3…

leetcode-链表经典题

1.反转单链表 206. 反转链表https://leetcode.cn/problems/reverse-linked-list/这里我们使用创建一个变量cur来遍历原链表&#xff0c;再创建一个新节点newnode&#xff0c;首先使用一个循环来遍历原链表&#xff0c;cur为NULL是循环结束&#xff0c;每次进入循环将cur的下一…

Django之路由层

目录 一、路由层 二、无名分组 三、有名分组 四、反向分析 1. 无名分组反向解析 2. 有名分组反向分析 五、路由分发 六、名称空间(了解) 七、伪静态的概念(了解) 八、虚拟环境(了解) 九、Django1和Django2的区别 1. 路由文件 2. 创建表关系 一、路由层 Django1中…

Django(复习篇)

项目创建 1. 虚拟环境 python -m venv my_env ​ cd my_env activate/deactivate ​ pip install django ​2. 项目和app创建 cd mypros django-admin startproject Pro1 django-admin startapp app1 ​3. settings配置INSTALLED_APPS【app1"】TEMPLATES【 DIRS: [os.pat…

测试用例之翻页功能

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

python socketserver模块开启ssl双向认证

server端代码如下 import socketserver import ssl# 需要校验客户端 ssl_context ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) # 发给客户端 ssl_context.load_cert_chain(certfile"./server.crt", keyfile"./server.key") # 信任库 ssl_conte…

LabVIEW中NIPackageManager功能介绍

LabVIEW中PackageManager功能介绍 使用NIPackage Manager可安装、更新、修复和删除NI软件。 安装NI软件 使用PackageManager浏览和安装NI软件。 1. 在浏览产品选项卡上&#xff0c;单击产品类别以显示该类别中的可用产品。 2. 选择要安装的产品&#xff0c;然后单击…

OpenCV:图像矫正与仿射变换

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

Netty--文件编程

3. 文件编程 3.1 FileChannel ⚠️ FileChannel 工作模式 FileChannel 只能工作在阻塞模式下 获取 不能直接打开 FileChannel&#xff0c;必须通过 FileInputStream、FileOutputStream 或者 RandomAccessFile 来获取 FileChannel&#xff0c;它们都有 getChannel 方法 通过…

ablation study

文章目录 ablation study1、消融实验思想是什么&#xff1f;2、消融实验意义3、消融实验应用场景举例 ablation study 1、消融实验思想是什么&#xff1f; “消融实验”&#xff08;ablation study&#xff09;通常指的是通过逐步移除系统的一部分来评估该系统的贡献。这种方法…