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

news2025/4/7 1:50:22

在这里插入图片描述

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 string
	Age  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.coloradmin.cn/o/1198857.html

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

相关文章

数据结构与算法之排序: Leetcode 21. 合并两个有序链表 (Typescript版)

合并两个有序链表 https://leetcode.cn/problems/merge-two-sorted-lists/ 描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 …

【网络奇遇记】电路交换与分组交换谁更 “ 美 ”

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. 电路交换1.1 电路交换讲解1.2 电路交换实例 二. 分组交换1.1 分组交换讲解1.2 分组交换实例1.3 …

Producer

Producer开发样例 版本说明 新客 户端, 从Kafka 0.9.x 开始, client基于Java语言实现。同时提供C/C, Python等其他客户端实现。 开发步骤 配置客户端参数以及创建客户端实例;构建待发送消息;发送消息;关闭生产者实例; 代码示例 public class KafkaProducer {public stati…

什么是数据库事务、事务的ACID、怎么设置/禁止自动提交?

数据库事务及ACID 数据库事务是指作为单个逻辑工作单元执行的一组操作。这组操作要么全部成功地执行,要么全部不执行,不允许出现部分执行的情况。数据库事务通常需要满足ACID属性,即原子性(Atomicity)、一致性&#x…

建行驻江门市分行纪检组以政治谈话压责任促发展

开展政治谈话,是加强“一把手”和领导班子监督、严肃党内政治生活、加强对党员领导干部日常教育管理的有效手段。 为督促“一把手”和领导班子成员依法依规履行职责、行使权力,推动党中央重大决策部署以及建设银行总行、广东省分行党委的决策部署在本单…

SpringBoot学习(黑马程序员day12)

1jwt令牌 JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割) 第一部分:Header(头), 记录令牌类型、签名算法等。 例如: {"alg":"HS256",&qu…

Linux各种版本安装详细步骤和root密码破解

文章目录 VMware新建虚拟机硬件设置设置虚拟网络挂载ISO文件 root密码破解 VMware新建虚拟机 硬件设置 设置虚拟网络 编辑>虚拟网络编辑器>VMnet8(NAT模式) 挂载ISO文件 加电>开启次虚拟机 第二项可以检查挂载上来的iso文件是否完整没有破坏 磁盘分区 选自定义分…

Linux应用开发基础知识——字符文字编码(五)

前言: TXT 文件中保存的是字符的核心:它的编码值。而 Notepad 上显示时, 这些字符对应什么样的形状态,这是由字符文件决定的。编码值,字体是两个不一样的东西,比如 A 的编码值是 0x41,但是在屏幕…

用excel计算一个矩阵的转置矩阵

假设我们的原矩阵是一个3*3的矩阵: 125346789 现在求它的转置矩阵: 鼠标点到一个空白的地方,用来存放结果: 插入-》函数: 选择TRANSPOSE,这个就是求转置矩阵的函数: 点击“继续”&#xff1a…

SparkSQL之Rule体系

在Unresolved LogicalPlan逻辑算子树的操作(如绑定、解析、优化等)中,主要方法都是基于规则(Rule)的,通过Scala语言模式匹配机制(Pattern-match)进行树结构的转换或节点改写。Rule是…

TCP协议(建议收藏)

1. TCP特点 有连接:需要双方建立连接才能通信,在socket编程中服务端new ServerSocket(port)需要绑定端口,在客服端new Socket(serverIp, serverPort)与服务端建立连接可靠传输:确认应答机制,超时重传机制面向字节流&a…

Python开源项目PGDiff——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

python ansconda 等的下载、安装等请参阅: Python开源项目CodeFormer——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践https://blog.csdn.net/beijinghorn/article/details/134334021 友情提示: …

vue 使用js new Map()优化多个if else 执行方法

前言 在实际开发中根据业务需求我们经常要判断情况,一个if 我们科技直接使用ES6就可以解决 经常会出现根据不同的条件执行不同的方法,这是就会有多个if else 看起不太美观也费劲 js new map ()就可以解决这个问题,它…

建行广东省江门市分行走进农村地区开展反假货币宣传

人民对美好生活的向往,涉及方方面面,小至“钱袋子”安全。建行广东省江门市分行落实当地监管部门部署,积极扛起维护国家金融安全的重要政治责任,深入农村地区开展反假货币宣传工作,助力构建农村反假货币工作长效机制。…

notes_质谱蛋白组学数据分析基础知识

目录 1. 蛋白组学方法学1.1 液相-质谱法1) 基本原理2) bottom-up策略的基本流程 1.2 PEA/Olink 2. 质谱数据分析2.1 原始数据格式2.2 分析过程1)鉴定2)定量3)预处理 2.3 下游分析 参考附录 1. 蛋白组学方法学 目前常见的蛋白组学方法学如下图…

【C/C++笔试练习】内联函数、函数重载、调用构造函数的次数、赋值运算符重载、静态成员函数、析构函数、模板定义、最近公共祖先、求最大连续bit数

文章目录 C/C笔试练习选择部分(1)内联函数(2)函数重载(3)调用构造函数的次数(4)赋值运算符重载(5)静态成员函数(6)调用构造函数的次数…

一句话讲明白buck和boost电源电路

大部分教程就是垃圾 虽然buck和boost结构上很像,但是是两个原理完全不一样的东西 BUCK(降压)电源 buck就是把方波,用LC滤波器后,变成正弦波 滤波:就是让电压缓慢增加,缓慢减少。&#xff08…

【SoC基础】DMA的工作原理

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

19.删除链表的倒数第N个结点(LeetCode)

想法一 先用tail指针找尾,计算出节点个数,再根据倒数第N个指定删除 想法二 根据进阶的要求,只能遍历一遍链表,那刚刚想法一就做不到 首先,我们要在一遍内找到倒数第N个节点,所以我们设置slow和fast两个指…

02. Python基础数据类型

1、前言 前面我们介绍了认识了Python以及Python的基础环境搭建,今天我们介绍下Python的一些基础语法。 2、Python基础 2.1、输入输出 2.1.1、输出 print() 用于输出指定的文字,括号中的为输出的字符串。print()也可以同时接收多个字符串,…