Directorio de artículos
- declaración de función
- declaración de variables
- inferencia de tipos
- Clase heredada/interfaz implementada
- Diseño de seguridad nula
- llamador
- palabra clave lateinit
- tipo de plataforma
- Tipo de juicio
- Obtener objeto de clase
- colocador/captador
- Constructor
- @JvmField propiedades generadas
- Cualquiera y unidad
- formación
- Funciones y propiedades estáticas.
- @JvmStatic
- Patrón singleton/clase interna anónima
- cadena
- intervalo
- cuando palabra clave
- excepción marcada
- Declarar interfaz/clase abstracta/enumeración/anotación
- compilar constantes de tiempo
- Etiqueta
- atravesar
- clase interna
- modificador de visibilidad
- Comentario
- aserción no nula
- abierto/final
- Preguntas después de la escuela
declaración de función
Para declarar una función, use la palabra clave fun, tal como usa la palabra clave class para declarar una clase.
El "tipo de parámetro" del "parámetro de función" está en el lado derecho
del "nombre del parámetro". El "valor de retorno" de la función se usa en el lado derecho del "parámetro de función": separado, se puede omitir si no hay un valor de retorno
- Declarar una función sin valor de retorno:
fun main(){
println("123")
}
- Declarar parámetros con valores de retorno:
fun sum(x:Int,y:Int):Int{
println("123")
}
declaración de variables
-
Debe utilizar palabras clave para declarar variables: var declara variables legibles y escribibles y val declara variables de solo lectura.
-
"Tipo" está en el lado derecho de "Nombre de variable", separado por: Al mismo tiempo, si se cumple la "inferencia de tipo", el tipo se puede omitir.
-
Cree un objeto y llame al constructor directamente sin la nueva palabra clave.
-
Declarar variables legibles y escribibles:
var x: Int= 1
- Declarar variables de solo lectura:
val username:String = "username"
- declarar objeto
val user:User = User()
inferencia de tipos
Si el tipo del lado derecho de la expresión se puede inferir en función de la declaración de la variable, se puede omitir el tipo:
var age = 18
val name = "Hello"
val user = User()
Clase heredada/interfaz implementada
Tanto las clases heredadas como las interfaces implementadas usan: Si no hay un constructor en la clase, debe agregar () después del nombre de la clase principal:
class MainActivity : AppCompatActivity(),View.OnClickListener{
}
Así es como funciona en Java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
}
Diseño de seguridad nula
Los tipos en Kotlin se dividen en "tipos que aceptan valores NULL" y "tipos que no admiten NULL":
- tipo no anulable
val username: EditText
- tipo anulable
val username: EditText?
llamador
!!
Forzar a la persona que llama?.
llamada segura
palabra clave lateinit
La palabra clave lateinit indica que una variable se puede inicializar después de ejecutar su expresión de inicialización.
lateinit
Solovar
se pueden modificar variables legibles y escribibles, porque val define la variable como inmutable y debe inicializarse cuando se declara.lateinit
El tipo de variable declarada por la palabra clave debe ser un "tipo no anulable"lateinit
La variable declarada no puede tener un "valor inicial"lateinit
La variable declarada no puede ser un "tipo de datos básico".
Los atributos inicializados en el constructor no requierenlateinit
la palabra clave.
tipo de plataforma
El tipo con un signo de exclamación después del tipo es un "tipo de plataforma". En Java, las anotaciones se pueden utilizar para reducir la aparición de dichos tipos de plataforma.
@Nullable
Representa un tipo que acepta valores NULL@NotNull
@NonNul l
Indica un tipo que no admite valores NULL
Tipo de juicio
-
is
Determinar si pertenece a un determinado tipo.
-
!is
El juicio no pertenece a un determinado tipo.
-
as
La coerción de tipo generará una excepción de falla de coerción de tipo cuando falle.
-
as?
Escriba coerción, pero no arroja una excepción pero regresa cuando fallanull
Obtener objeto de clase
- Usar nombre de clase::clase para obtener el tipo de Kotlin es KClass
MainActivity::class
- Utilice nombre de clase::class.java para obtener el tipo de Java
startActivity(Intent(this,test::class.java))
colocador/captador
Cuando se declara una propiedad en Kotlin (sin modificación), se generan automáticamente private
una propiedad privada y un par de funciones públicas . Utilice en lugar de propiedades privadas internas al escribir (para evitar el desbordamiento de pila recursivo )setter/getter
setter/getter
field
class User {
var username : String?= null
var password : String?= null
set(value) {
field = value
}
get() {
return field
}
//构造器
constructor(){
}
constructor(username : String?,password : String?){
this.username = username
this.password = password
}
}
¿Por qué se puede simplificar EditText.getText () pero EditText.setText () no se puede
simplificar de la misma manera que TextView.setText ()?
Porque el tipo obtenido por EditText.getText () es editable y, en consecuencia, si EditText.setText ( ) pasa Se puede simplificar si los parámetros ingresados también son editables.val newEditable= Editable.Factory.getInstance().newEditable("Kotlin") et_username.text = newEditable
Constructor
Declarar un constructor usando la palabra clave constructor
//构造器
constructor(){
}
constructor(username : String?,password : String?){
this.username = username
this.password = password
}
Si llamamos activamente al constructor de la clase principal en el constructor, no podemos agregar paréntesis después de la clase al heredar la clase.
constructor(context: Context) : this(context, null)
// 主动调用用了父类的构造器
constructor(context: Context, attr: AttributeSet?) :
super(context, attr)
@JvmField propiedades generadas
A través de la anotación @JvmField, el compilador solo puede generar una propiedad de miembro público y no generar la función setter/getter correspondiente.
@JvmField
var username : String?= null
User user = new User();
String username = user.username;
Cualquiera y unidad
- La clase principal de nivel superior de Any
Kotlin es Any, que corresponde a Object en Java, pero carece de wait()/notify() y otras funciones además de Object.
class User : Any {
}
- Unidad Unidad
en Kotlin corresponde a void en Java
fun get():Unit{
}
formación
Utilice arrayof() para crear una matriz y utilice el intArrayOf() correspondiente para tipos de datos básicos, etc.
val list:Array<String> = arrayOf("1", "2", "3", "4")
val Intlist:IntArray = intArrayOf(1, 2, 3, 4)
Funciones y propiedades estáticas.
- Función de nivel superior
Una función de nivel superior que no depende de ningún objeto o clase específica. Las funciones de nivel superior se pueden usar directamente en cualquier lugar sin crear una instancia de la clase
Nombre de clase Método de llamada
class MyClass {
fun greet(name: String): String {
return "Hello, $name"
}
}
Luego puedes crear una instancia de la clase y llamar a sus métodos de esta manera:
val myClass = MyClass() // Create an instance of MyClass
val greeting = myClass.greet("John") // Call the greet() method on the instance
println(greeting) // Prints: Hello, John
- objeto
- Entre los objetos complementarios
, la "función de nivel superior" define directamente funciones y propiedades en el archivo, que se generarán directamente de forma estática y se puede acceder a ellas a través del "nombre de archivo Kt" en Java. Al mismo tiempo,@file:JvmName
el "nombre de clase" Se puede modificar mediante anotaciones. Cabe señalar que este tipo de función de nivel superior no debe declararse enmodule
el paquete de nivel superior, sino que debe estar en al menos un paquete, por ejemplocom
. De lo contrario, no será cómodo de utilizar.object
ycompanion object
ambos generan objetos singleton y luego acceden a funciones y propiedades a través del objeto singleton.
@JvmStatic
A través de esta anotación, las funciones y propiedades internas de object
y companion object
se generan realmente como estáticas.
La anotación @JvmStatic generalmente se usa para marcar métodos estáticos o variables a las que se debe acceder directamente en la JVM. Cuando el código Kotlin se compila en código de bytes JVM, el procesador de anotaciones inserta estos métodos y variables estáticos en la clase Java generada.El
método greet() está marcado con la anotación @JvmStatic. Cuando esta clase Kotlin se compila en una clase Java, el método greet() se inserta en la clase Java generada y se puede acceder a él directamente a través del nombre de la clase sin crear una instancia de la clase Kotlin.
En Java, puedes llamar al método currentApplication() de esta manera:
Patrón singleton/clase interna anónima
object
Implementado a través de palabras clave
// 单例
object Singleton {
}
// 匿名内部类
object : Callback {
}
cadena
Plantilla de cadena
Utilice ${}
el formulario como plantilla de cadena
val number = 100000000
val text = "支付宝收款${
number}元。"
// 如果只是单一的变量,可以省略掉 {}
val text2 = "支付宝收款$number元。
cadena multilínea
val s = """
我是第一行
我是第二行
我是第三行
""".trimIndent()
intervalo
200…299 representa el intervalo de 200 -> 299 (incluido 299)
300…399 representa el intervalo de 300 -> 399 (incluido 399)
cuando palabra clave
La versión avanzada de Java switch
puede admitir expresiones en condiciones de rama.
excepción marcada
Kotlin no necesita utilizar try-catch
la captura de excepciones forzada
Declarar interfaz/clase abstracta/enumeración/anotación
// 声明抽象类
abstract class
// 声明接口
interface
// 声明注解
annotation class
// 声明枚举
enmu class
compilar constantes de tiempo
Agregar la palabra clave a una variable estática const
se convierte en una constante en tiempo de compilación
. La palabra clave const se puede usar para declarar una constante en tiempo de compilación. A esta constante se le debe asignar un valor cuando se declara y debe ser un valor literal, no una llamada de función o una expresión. Además, las constantes constantes deben ser de solo lectura y no se pueden modificar en tiempo de ejecución.
Etiqueta
-
Obtenga la referencia de la clase de destino mediante "
类名.this
por ejemplo " en JavaOuter.this
-
Obtenga la referencia de la clase objetivo mediante "
this@类名
por ejemplo " en Kotlinthis@Outer
atravesar
Recuerde dejar que el IDE ayude a generar el bucle for.
for(item in items)
clase interna
En Kotlin
, las clases internas son clases internas estáticas de forma predeterminada y se declaran como clases internas anidadas
usando la palabra claveinner
modificador de visibilidad
El modificador de visibilidad predeterminado es public
el nuevo modificador de visibilidad, que internal
indica la visibilidad del módulo actual.
Comentario
Puede utilizar [] en cualquier parte del comentario para hacer referencia al destino, en lugar de @param @link
etc. en Java.
aserción no nula
La conversión de tipos de un tipo que acepta valores NULL a un tipo que no admite NULL se puede lograr agregando !! después de la variable.
abierto/final
Las clases y funciones en Kotlin están final
decoradas ( abstract
y con override
excepciones) de forma predeterminada
Preguntas después de la escuela
- ¿El compilador de Kotlin creará un constructor de forma predeterminada?
En Kotlin, los constructores, al igual que otras partes de una clase, deben declararse explícitamente. Si no declara un constructor, el compilador de Kotlin generará un constructor predeterminado sin argumentos . Este constructor predeterminado no llama a ningún código, es decir, es una función vacía.
- var nombre de usuario: Cadena? = "123"
Declare una variable variable llamada nombre de usuario, su tipo es String? (cadena que acepta valores NULL) y se inicializa en "123". Si necesita cambiar
el valor del nombre de usuario, puede asignarle directamente una nueva cadena o un valor nulo.
- edad de var pública: Int = 0
En Kotlin,
public var age : Int = 0
y@JvmField var age : Int = 0
ambos se pueden usar para declarar una variable entera pública, mutable, inicializada en 0 en Kotlin. Sin embargo, los dos no son del todo equivalentes.public var age : Int = 0
Las variables se declaran directamente en Kotlin y su visibilidad predeterminada espublic
que se puede acceder a ellas mediante cualquier otro código. En su lugar,
@JvmField var age : Int = 0
utilice anotaciones@JvmField
, que generan unJava
campo visible en .@JvmField
El propósito es permitir que las variables en Kotlin se representen como campos en el código Java en lugar de acceder a ellas a través de
getter
los métodos ysetter
. La principal diferencia entre los dos es que si necesita acceder a las variables de Kotlin directamente en Java (en lugar de a través de
captadores y definidores), entonces debe usar@JvmField
. Si sólo estás usando esta variable dentro de Kotlin o en otro lugar que admita Kotlin
, entonces puedes usarla directamentepublic var age : Int = 0
.
En términos generales, los dos no se reemplazan entre sí, pero usted elige cuál usar según el escenario de uso específico.
- Ejemplo:
suponga que tiene la siguiente definición de clase Kotlin:
class Person {
var name: String = "John"
@JvmField var age: Int = 0
}
Si usa @JvmField, puede acceder y modificar la variable de edad directamente en Java de la siguiente manera:
Person person = new Person();
person.age = 25; // 可以直接修改 age 变量
int age = person.age; // 通过字段获取 age 值
Sin embargo, si elimina @JvmField y usa la edad de var pública: Int = 0, aún puede acceder y modificar la variable de edad directamente en Kotlin, pero en Java debe acceder a ella a través de los métodos getter y setter:
Person person = new Person();
person.setAge(25); // 通过 setter 方法修改 age 值
int age = person.getAge(); // 通过 getter 方法获取 age 值
Por lo tanto, el objetivo principal de usar @JvmField es acceder directamente a las propiedades de Kotlin en Java sin utilizar métodos getter y setter . Si solo usa esta propiedad en Kotlin, entonces usar public var age: Int = 0 es suficiente. Sin embargo, si necesita interoperar con código Java y desea acceder a las propiedades de Kotlin directamente en Java, usar @JvmField es una opción más apropiada.
- this en Kotlin.
En Kotlin, la palabra clave this tiene un significado especial. Se utiliza para hacer referencia a la instancia del objeto actual.
En Kotlin, la palabra clave this tiene varios usos:
- Haga referencia directa a la instancia del objeto actual: en un método de clase, puede usar la palabra clave this para hacer referencia a la instancia del objeto que se está ejecutando actualmente . Por ejemplo:
class MyClass {
var name: String? = null
fun printName() {
println(this.name)
}
}
En este ejemplo, la palabra clave this hace referencia a la instancia del objeto que se está ejecutando y se imprime el atributo de nombre de la instancia.
- Haga referencia a las propiedades o métodos del objeto actual : cuando necesite acceder a sus propiedades o métodos a través de un objeto, puede utilizar la palabra clave this. Por ejemplo:
class MyClass {
var name: String? = null
fun printName() {
println(this.name)
}
}
En este ejemplo, la palabra clave this hace referencia a la instancia del objeto que se está ejecutando y se imprime el atributo de nombre de la instancia.
- Hacer referencia a variables externas en funciones anónimas o expresiones Lambda : en funciones anónimas o expresiones Lambda, puede utilizar la palabra clave this para hacer referencia a variables externas. Por ejemplo:
fun outerFunction() {
val x = 10
val action = object : Action<Int> {
override fun run(input: Int) {
println("Value of x from outer function: $x") // Here, 'this' refers to the outer function's 'x' variable.
}
}
action.run(5)
}
En este ejemplo, la palabra clave this se refiere a la variable x de la función externa.
- [Pregunta de ensayo] Utilice Kotlin para obtener código al que hacen referencia clases externas
val exterior = /* referencia de clase externa*/
Si desea obtener una referencia a una clase externa en Kotlin, primero debe definir esa clase externa como accesible y luego puede hacer referencia a ella directamente en la clase interna.
Por ejemplo, supongamos que tiene una clase externa llamada OuterClass y desea obtener una referencia a esa clase en la clase interna InnerClass. Puedes hacerlo:
class OuterClass {
var name: String? = null
}
class InnerClass {
val outer: OuterClass? = null
fun printOuterName() {
outer?.let {
println("Name of the outer class: ${
it.name}")
}
}
}
En este ejemplo, OuterClass es una clase externa y InnerClass es una clase interna. En InnerClass, declaramos una
variable externa, que es una referencia a OuterClass. Luego, en el método printOuterName, accedemos
al atributo de nombre de la clase externa a través de la variable externa.
- [Pregunta de ensayo] ¿La persona está debajo de una interfaz? ¿Por qué?
clase Usuario: Persona()
En el código que proporcionaste, Persona no es una interfaz, sino una clase. Está utilizando el lenguaje Kotlin, que admite la herencia de interfaces o clases mediante dos puntos (:).
En este código, la clase Usuario hereda la clase Persona usando:. Esto significa que Usuario es una subclase de Persona y hereda las propiedades y métodos de Persona.
Si Persona es una interfaz, debe declararse utilizando la interfaz Persona. Entonces, en este fragmento de código, Persona no es una interfaz, es una clase.