大家好,今天小编关注到一个比较有意思的话题,就是关于java语言保留字的问题,于是小编就整理了2个相关介绍j***a语言保留字的解答,让我们一起看看吧。

  1. C#和Java对于结构体的保留有何区别?
  2. java中注解方式是否是侵入?

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

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

java语言保留字-java语言保留字有哪些
(图片来源网络,侵删)

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


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

java语言保留字-java语言保留字有哪些
(图片来源网络,侵删)

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

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

java语言保留字-java语言保留字有哪些
(图片来源网络,侵删)

结构体最先来源于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)时封送操作的复杂性。

在C#语言的后续发展中,早已和J***a分道扬镳,出现了大量创新性的语言功能。

由此可以看出,是否存在结构体,并不影响J***a语言的功能完整性,只是牺牲一些性能优化的潜力,或者增加了某些操作的复杂性(总归是有替代方案来解决的)。而C#中结构体如果滥用,也可能导致语义的混乱和性能的损失。


以上是我个人的一些粗浅理解,觉得有道理请点赞。觉得有疏漏谬误,望在评论区指点。

j***a中注解方式是否是侵入

谢邀,作为一个J***a软件工程师对这个问题有自己的见解。

先搞清楚侵入性的概念

当你的代码引入了一个组件,导致其它代码或者设计,要做相应的更改以适应新组件.这样的情况我们就认为这个新组件具有侵入性。

显然,如果设计的代码对原有代码逻辑有代码侵入的话,是一个糟糕的设计方式。什么是侵入性?个人认为就是一旦你这段添加的代码出现异常对原本的代码会有极大影响,那你这段代码侵入性就太明显了。

而注解对代码是否有侵入性呢?

要知道注解是从老版jdk就有的一个语法特性,目前广泛运用在各大框架中间件的开发中,比如我们最常用的spring框架,编程时service和autoware等注解几乎是必用的。如果说注解式编程对代码有过度侵入性,我想甲骨文公司也不会去创造注解这种东西。显然,注解本身并不会对代码造成侵入,反而他的设计是为了解耦合,通过代理等方式将需要引入的组件添加到原逻辑中。

但是注解一定不会侵入吗?

答案是否定的,注解本身其实不用纠结会不会侵入,而是对注解使用过程中的开发者,是否会写出侵入性极强的代码。用注解完全可以写出侵入式的代码,比如在写spring的aop时,后置处理的代码有bug,那必然会导致原逻辑不能正常进行,这就是一种侵入,而且还影响很大。


宇文哥习惯性总结:注解是一件利器,用的好代码可以低耦合,用的不好,就会造成侵入性极强,没有最好的技术只有更好的编码者。

关注@极客宇文氏 一名热心有料的J***a软件工程师。

算是侵入式的,这也是我们用mybatis时推荐使用xml的原因之一,侵入的程度区别是依赖的注解是标准的JSR注解还是自定义的注解,标准JSR注解的通用性更强,也意味着侵入更低。特别提一下swagger的注解,直接导致源码乱糟糟,我们基本不推荐使用。

一个非常好的问题。我是工作多年的Web应用架构师,来回答一下这个问题。欢迎关注我,了解更多IT专业知识。

J***a注解不是代码侵入,只是在源文件中嵌入“附加”信息,不改变原程序的运行。获取注解信息时通过反射机制读取。


一,J***a注解用途

J***a从5.0开始支持注解,Spring框架也从2.5开始舍弃xml配置,使用注解。

J***a Annotation注解也叫元数据,不改变程序的运行,在编译、加载、运行时被读取,可以被很多工具使用,比如代码扫描工具、开发工具和部署工具等。

J***a注解用途广泛,熟练使用它们有助于提高代码质量和开发效率,也是工程师水平高低的一个反映。


二,J***a注解保留策略

声明注解时,指定不同的保留策略RetentionPolicy,比如@Override在编译时就被丢弃了,@Bean注解一直保留到运行时。


三,J***a注解分类

J***a注解很多,应用于多种功能场景,可以声明在package包、类、方法、成员变量、局部变量、形参等前面,用来对这些元素进行说明和注释。我们在实际开发工作中,会经常使用到一些注解,比如@Override, @Test,还有一些Spring注解,比如@Service, @Autowired, @SpringBootApplication

J***a + Spring Boot开发时,用到的注解按照来源可以分类为:J***a内置注解、Spring注解、Web注解、自定义注解,等等。


四,如何读取注解?

Package、Class、Constructor、Method、Field都实现了接口AnnotatedElement,该接口位于反射包j***a.lang.reflect中,调用功能函数获取注解信息:

比如声明一个HelloAnnotation注解,创建一个HelloClass类,然后增加注解。代码运行读取注解信息时,调用Class实现的AnnotatedElement反射接口函数,示例代码如下:

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