• 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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    Golang中的实现:

    type Person struct {
    	Name string
    	Age  int
    }
    
    func (p *Person) Eat(food string) {
    	fmt.Println("eat", food)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在上述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");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

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

    type Student struct {
    	*Person
    }
    
    func main() {
    	s := Student{&Person{Name: "Tom", Age: 20}}
    	fmt.Println(s.Name, s.Age)
    	s.Eat("breakfast")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在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);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    func (p *Person) Eat(food string) {
    	fmt.Println("eat", food)
    }
    
    func (p *Person) eat(food string) {
    	fmt.Println("eat", food)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    区别汇总

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

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

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

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

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

    小结

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

  • 相关阅读:
    Live555库结构及其核心概念
    Linux中通配符的使用
    vue 如何判断元素内容是否超过宽度的方式
    双十二有哪些数码好物值得入手、双十二必买数码好物清单
    Flink作业任务部署解读
    BP新增修改通信或独立地址通讯
    Java中的异步日志记录与性能优化
    这个项目,荣获“绽放杯”一等奖!
    不安装运行时运行 .NET 程序 - NativeAOT
    力扣第53题 最大子树组和 动态规划 + 贪心 两种方法 c++
  • 原文地址:https://blog.csdn.net/wo541075754/article/details/134358014