j***a语言有结构体,j***a有结构体么

kodinid 5 0

大家好,今天小编关注到一个比较意思的话题,就是关于java语言结构体的问题,于是小编就整理了5个相关介绍Java语言有结构体的解答,让我们一起看看吧。

  1. java impl是什么?
  2. SOCKET通信,客户端如何指定端口?
  3. C#和Java对于结构体的保留有何区别?
  4. 想用Java学习数据结构与算法,我应该掌握Java到哪种程度?
  5. 为什么Java只有值传递,但C# 既有值传递,又有引用传递,这种语言设计有哪些好处?

JAVA impl是什么

->是指针指向成员运算符 .是结构体的成员运算符。最大的区别是->前面放的是指针,而.前面跟的是结构体变量。2、例如: int &put(int n)

SOCKET通信客户如何指定?

服务器绑定端口一样,只是一般客户端不需要绑定端口。j***a应该也可以 struct sockaddr_in clientAddr; clientAddr.sin_family = AF_INET; clientAddr.sin_port = htons(6666)

java语言有结构体,java有结构体么-第1张图片-安济编程网
图片来源网络,侵删)

; clientAddr.sin_addr.S_un.S_addr = 0; bind(sockClient, (struct sockaddr*)&clientAddr, sizeof(clientAddr));

C#和J***a对于结构体的保留有何区别?

结构图是值类型,类是引用类型,为什么要有结构体??很简单,比如DateTime如果是类会出现很明显的问题,当前时间过段时间你再过去还会是当前时间,但是值类型就不会了,是多少就是多少

本人做过几年C#,对J***a也略有了解,根据自己的理解回答一下这个问题。

java语言有结构体,java有结构体么-第2张图片-安济编程网
(图片来源网络,侵删)

首先,J***a和C#的设计原则是有所不同的。J***a是一门学院派语言,奉行的设计原则是完美的面向对象模型。任何和这个完美模型相违背的东西,都会被J***a社区排斥,从而很难进入J***a语法。C#虽然语法上和J***a很相似,但是却包含了很多为了实用而做出的折衷/改善。

一个典型的例子是C#中的委托(delegate),其实是不符合面向对象的封装原则。J***a中没有委托结构,在处理类似的***多播时,就产生了大量的监听(listener)接口。语法上来讲,委托非常简洁,而监听接口则显得很冗余。但是因为J***a社区对语言纯洁性的偏执,始终没有做出妥协。

结构体(struct)也是类似的情况。

java语言有结构体,java有结构体么-第3张图片-安济编程网
(图片来源网络,侵删)

结构体最先来源于C语言。C++虽然引入了类(class),但是仍然保留了结构体的原本语义,并做了适当增强,从而实现对C的绝对兼容。这个方案对于C++而言,不难理解,毕竟C++并不是一门纯粹面向对象的语言,同时严重依赖于C接口。C++中的类和结构体,除了默认访问级别不同,没有任何其它区别,都是既可分配在栈上,也可以分配在堆上。

J***a语言的基础语法借鉴自C++,但是只保留了真正面向对象的部分。得益于自动垃圾回收机制的应用程序员不再需要手工管理堆上的对象,故而栈所扮演的自动管理的角色也变得可有可无。结构体作为C语言的遗物,也就被彻底抛弃了。J***a只支持将最基本的内置值类型分配到栈上。

C#语言最初在语法层面确实大量借鉴了J***a语法(有人还记得当年的J++和J#吗?),但是又做了大量实用性的改造,结构体正是其中之一:

首先,即使应用了垃圾回收机制,堆上对象的使用成本依然是比较高的,分配速度慢,回收开销大。C#通过重新定义结构体的语义,允许开发者自定义值类型的结构体,纳入栈内存管理,满足开发者对特殊语义的需要(比如虚数,就很适合设计为值类型),在合理使用的前提下也可以提高性能

另外一方面,通过对结构体应用显式布局模式(explicit layout),使得结构体可以按照与C完全相同的模式来布局,甚至支持联合体(union),从而在调用C接口的API时可以直接传入传出,降低了平台调用(PInvoke)时封送操作的复杂性。

想用J***a学习数据结构算法,我应该掌握J***a到哪种程度?

首先强调一点,数据结构和算法其实和语言没有太大关系,编程语言只是我们实现算法的工具。这里我为你整理了一份常见的你可以尝试去实现的算法清单:

链表类题目

1. O(1)时间删除链表节点

2. 链表反转

3. 旋转单链

4. 查到倒数第K个链表节点

5. 求链表的中间节点

6. 划分链表使得所有小于x的节点排在大于等于x的节点之前

7. 合并有序链表

为什么J***a只有值传递,但C# 既有值传递,又有引用传递,这种语言设计有哪些好处?

J***a有值引用也有址引用,只是J***a不[_a***_]直接址引用,取消了指针,但其实时刻在用,比如,对象的调用,传的的是地址,不是值,这样规范了指针和址引用的方法,避免出错,使开发人员更专注业务实现而不是内存级的开发

J***a除基础数据类型外,没有值类型,只有引用类型。因此不存在需要大量拷贝的大结构体。对于基础数据类型,其长度与一个指针长度相近,不需要使用指针来避免太长的内存拷贝。对于引用类型,变量本身就是指向对象的指针,不需要额外套一层引用。因此J***a不需要引用传递。

C#作为更先进的语言,为了给与开发者更多的性能优化的空间和原生交互的体验,允许用户自定义更复杂的值类型,因此会涉及到size较大的值类型在传值时需要大量拷贝的情况,为了避免太长的内存拷贝,对变量进行引用传递是非常必要的。

引用传递的优点:

有效避免了变量复制的开销,比如参数是一个比较复杂的结构体,那么使用引用传递就比直接传递来得好,性能会有优势。

引用传递的缺点:

引用传参,在函数中对该变量所做的修改,在函数返回后依然存在,这有时候其实并不是开发者希望的结局。

至于J***a为什么不提供引用传递这样的机制,可能是J***a语言设计者的一个思想问题,可能是为了保持简单、统一性。比如J***A里也没有多继承的概念,而在C++中是可以实现多继承的。J***a中没有自定义值类型的方式,既然J***a中所有自定义类型都是引用类型,那么这个语法作用就很有限,不支持就是正常的。

而C#提供这样的机制,也是语言设计者的思路问题,可能是本着用户怎么方便怎么来的初衷而设计,C# 原本设计是用来代替 C++ 做 win32 开发的,之前很多用MFC做winform的,C#的出现使得winform开发变得快速、简单,我个人认为C#语言设计的很先进、优秀。

到此,以上就是小编对于j***a语言有结构体的问题就介绍到这了,希望介绍关于j***a语言有结构体的5点解答对大家有用。

标签: C# j***a 结构