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.hqwc.cn/news/179966.html

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

相关文章

银行数据中心机房动力环境监控系统设计与优化

安科瑞电气股份有限公司 上海嘉定201801 摘要:结合银行数据中心建设项目,设计银行数据中心机房动力环境监控系统,分析银行数据中心机房监控对象、搭建系统监控架构,给出监控实现方法,*后针对运行一段时间出现的问题&a…

第3关:集合操作100

任务描述相关知识编程要求测试说明 任务描述 本关任务:使用 集合操作解决实际问题 相关知识 1.集合并操作符 可转换为SQL 若R,S的属性名不同,可使用重命名使相应列名一致后进行并操作 例如:R(A,B,C) S(D,E,F) select A,B from R union sel…

TikTok对文化艺术的影响:传统与现代的碰撞

在这个数字时代,社交媒体平台不仅改变了我们的社交方式,也对文化和艺术产生了深远的影响。其中,TikTok是一个备受欢迎的应用,已成为传统与现代文化艺术交汇的独特平台。本文将深入探讨TikTok对文化艺术的影响,以及传统…

java成员等讲解

一个源文件只有一个public类 如何调用是这个 类里面有全局用类名调用(或者对象),非全局要新一个对象来调用 class Quanjv{public static int x1;public static int y2;public int y24;} public class chengyuan {public static void main(String[] args) {Quanjv quanjvn…

mysql 中with的用法(1)

mysql 中with的用法 1、案例一: 建表: CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),salary INT );INSERT INTO employees (employee_id, first_name, last_name, salary) VALUES (1, John, Do…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用

随着航空、航天、近地空间等多个遥感平台的不断发展,近年来遥感技术突飞猛进。由此,遥感数据的空间、时间、光谱分辨率不断提高,数据量也大幅增长,使其越来越具有大数据特征。对于相关研究而言,遥感大数据的出现为其提…

【Git】说说Git中开发测试的使用Git分支Git标签的使用场景

一、环境介绍 dev环境:开发环境,外部用户无法访问,开发人员使用,版本变动很大。test环境:测试环境,外部用户无法访问,专门给测试人员使用的,版本相对稳定。pre环境:灰度环…

tsmc12 nm boundary cell注意事项

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章导读: boundary cell添加失败问题整理 注意N/P的区别 针对上下两边的boundary cell,有N/P类型的区别,看版图衬底形状上下是不对称的,而且P

Mysql中的索引与事务和B树的知识补充

索引与事务和B树的知识补充 一.索引1.概念2.作用3.使用场景4.使用 二.事务1.为什么使用事务2.事务的概念3.使用3.1脏读问题3.2不可重复读3.3 幻读问题3.4解决3.5 使用代码 三.B树的知识补充1.B树2.B树 一.索引 1.概念 索引是一种特殊的文件,包含着对数据表里所有记…

centos7下载python3离线安装包

下载离线安装工具 yum install yum-utils -y下载python3离线安装包 yumdownloader --destdir/root/python3 --resolve python3将python3下面的离线安装文件拷贝到其他服务器上就可以安装 离线安装 先进入到离线程序rpm文件存储路径 # 离线安装 rpm -Uvh --force --nodep…

STM32F103C8T6硬件spi读取ADS1118

硬件SPI读取ADS1118 文章目录 硬件SPI读取ADS1118前言一、ADS1118技术手册二、SPI的配置1.spi.c和.h的配置2.ads1118.c3.ads1118.h 总结 前言 现在要用到SPI去读取数据,读取的芯片是ADX的一款,但是和ADS1118是一模一样的 分享一下读取的过程 一、ADS11…

【Android 】android13 新权限获取 读写文件权限

android13 新权限获取 参考:Android 13(API 33)读写SD卡权限的调整适配 - Mr,Han - 博客园 android在 获取文件读写权限(尤其是音视频、图片等等资源)的权限获取逻辑更换了。 必须申请如下权限: public static final String READ…