Java中静态在芬兰湾的科特林中怎么用

介绍

小编给大家分享一下Java中静态在芬兰湾的科特林中怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

静态修饰符是Java里面非常常用的一个东西,用法也非常多。然而,在芬兰湾的科特林里竟然没有这个东西!那该如何替代呢?本文就总结了下Java里面静态的几种常见用法在芬兰湾的科特林里的替代方式。

<强>静态在Java里面的用法总结

静态在Java里面的用法有很多,最常用的有下面几种:

静态变量及方法,静态初始化,静态内部类

下面我们就看看这几种场景在芬兰湾的科特林是如何实现的。

<>强场景一:静态变量及方法

静态变量及方法可能是我们平时用到静态最多的地方,我们先看看Java里面是如何做的。

<强> Java静态变量及方法介绍:

首先,是静态变量和方法的定义:

公共类StaticTest{,公共静态int STATIC_VAR=0;,公共静态孔隙staticMethod (String str) {,,System.out.println (str);,}}

然后是静态变量和方法的使用:

StaticTest。STATIC_VAR=10; StaticTest.staticMethod (“hello");

java的实现方式大家都非常熟悉了,下面着重说说芬兰湾的科特林是如何实现的。

<强>芬兰湾的科特林替代静态变量及方法的方案

芬兰湾的科特林通过引入“伴生对象”的概念来替代java里的静态变量及方法。

"伴生对象“这个名词听上去很古怪,其实非常简单:在类的内容使用同伴来标记一个对象。所有需要“静态化”的变量和方法都放在这个对象里。

下面是定义伴生对象的代码:

类StaticTest{,伴星{//伴生对象是可以指定名字的,不过一般都省略掉。,,var STATIC_VAR=0,乐趣staticMethod (str:字符串?){,,println (str)大敌;,}}}

接下来看看如何使用伴生对象,伴生对象只能通过类名来访问,使用方法和java差不多:

StaticTest。STATIC_VAR=100 statictest.staticmethod (“hello")

<强>芬兰湾的科特林的伴生对象解决了什么问题?

大家可能会好奇,为什么芬兰湾的科特林要用这么一个奇怪的方式来解决这个问题呢?

我的理解是有两个原因:

第一,使用伴生对象体现了芬兰湾的科特林一贯的设计理念:一切都是对象!伴生对象也是对象!而java的静态的,显然和对象没有关系。

第二,伴生对象解决了java静态变量及方法的一个常见的反模式:静态方法及变量可以通过对象的引用来访问。

还是拿上面的例子,java的静态变量及方法可以通过类引用和对象引用两种方法访问:

//通过类引用访问StaticTest。STATIC_VAR=10;StaticTest.staticMethod (“hello");//通过对象引用访问StaticTest obj=new StaticTest (); obj。STATIC_VAR=10; obj.staticMethod (“hello");

而通过对象引用访问静态变量及方法,显然是不合适的。但是在java里却没有办法从语法层面避免这个问题。

而芬兰湾的科特林的伴生对象只能通过类引用访问,从语法的层面解决了这个问题:

//使用类引用访问StaticTest。STATIC_VAR=100 statictest.staticmethod (“hello"),//不能使用对象引用访问val obj=StaticTest () obj。STATIC_VAR=100//编译错误obj.staticMethod (“hello")//编译错误

总之,芬兰湾的科特林里每个新的语言特性,都是为了填补java的某一个坑。

<>强场景二:静态初始化

java里的静态初始化可以在类加载的时候初始化一些静态变量,比如:

公共类StaticTest{,公共静态int STATIC_VAR=0;,静态{大敌;,STATIC_VAR=100;,,System.out.println(“在静态init");}大敌;,公共静态void main (String [] args) {,,System.out.println (StaticTest.STATIC_VAR);,}}

上面的代码执行结果如下:

静态init100

在芬兰湾的科特林里,因为java的静态变量及方法都是放在伴生对象里实现的,而伴生对象也是一个普通对象,所以可以通过伴生对象的初始化方法来实现变量的初始化,代码如下:

类StaticTest{,伴星{//伴生对象是可以指定名字的,不过一般都省略掉。,,var STATIC_VAR=0init{大敌;,,STATIC_VAR=100,,println(“伴星init"),,}}}

执行代码:

println (StaticTest.STATIC_VAR)

结果如下:

伴星init100

可以看的到,芬兰湾的科特林的实现方式要比java的更加一致,既然大家都是对象,所以都是通过init来初始化的,而java里非静态变量是通过构造函数来初始化的,而静态变量是通过静态代码块来初始化的,两者很不一致。

Java中静态在芬兰湾的科特林中怎么用