Aprendizaje de conocimientos sobre desarrollo de Android: conceptos básicos de Kotlin

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.

  • lateinitSolo varse pueden modificar variables legibles y escribibles, porque val define la variable como inmutable y debe inicializarse cuando se declara.
  • lateinitEl tipo de variable declarada por la palabra clave debe ser un "tipo no anulable"
  • lateinitLa variable declarada no puede tener un "valor inicial"
  • lateinitLa variable declarada no puede ser un "tipo de datos básico".
    Los atributos inicializados en el constructor no requieren lateinitla 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.

  • @NullableRepresenta un tipo que acepta valores NULL
  • @NotNull @NonNul lIndica un tipo que no admite valores NULL

Tipo de juicio

  • isDeterminar si pertenece a un determinado tipo.
    Insertar descripción de la imagen aquí

  • !isEl juicio no pertenece a un determinado tipo.
    Insertar descripción de la imagen aquí

  • asLa coerción de tipo generará una excepción de falla de coerción de tipo cuando falle.
    Insertar descripción de la imagen aquí

  • 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 privateuna 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/getterfield

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
    Insertar descripción de la imagen aquí
    Insertar descripción de la imagen aquí
    Insertar descripción de la imagen aquí
  • Entre los objetos complementarios
    Insertar descripción de la imagen aquí
    Insertar descripción de la imagen aquí
    , 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:JvmNameel "nombre de clase" Se puede modificar mediante anotaciones. Cabe señalar que este tipo de función de nivel superior no debe declararse en moduleel paquete de nivel superior, sino que debe estar en al menos un paquete, por ejemplo com. De lo contrario, no será cómodo de utilizar. objecty companion objectambos 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 objecty companion objectse 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
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí

Patrón singleton/clase interna anónima

objectImplementado 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 switchpuede admitir expresiones en condiciones de rama.
Insertar descripción de la imagen aquí

excepción marcada

Kotlin no necesita utilizar try-catchla 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 constse 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.
Insertar descripción de la imagen aquí

Etiqueta

  • Obtenga la referencia de la clase de destino mediante " 类名.thispor ejemplo " en JavaOuter.this
    Insertar descripción de la imagen aquí

  • Obtenga la referencia de la clase objetivo mediante " this@类名por ejemplo " en Kotlinthis@Outer
    Insertar descripción de la imagen aquí

atravesar

Recuerde dejar que el IDE ayude a generar el bucle for.

for(item in items)

Insertar descripción de la imagen aquí

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
Insertar descripción de la imagen aquí

modificador de visibilidad

El modificador de visibilidad predeterminado es public
el nuevo modificador de visibilidad, que internalindica la visibilidad del módulo actual.

Comentario

Puede utilizar [] en cualquier parte del comentario para hacer referencia al destino, en lugar de @param @linketc. 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 finaldecoradas ( abstracty con overrideexcepciones) de forma predeterminada

Preguntas después de la escuela

  1. ¿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.

  1. 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.

  1. edad de var pública: Int = 0

En Kotlin, public var age : Int = 0y @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 = 0Las variables se declaran directamente en Kotlin y su visibilidad predeterminada es publicque se puede acceder a ellas mediante cualquier otro código. En su lugar,
@JvmField var age : Int = 0utilice anotaciones @JvmField, que generan un Java
campo visible en . @JvmFieldEl 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
getterlos métodos y setter. 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 directamente public 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.

  1. 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.

  1. [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.

  1. [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.

Supongo que te gusta

Origin blog.csdn.net/weixin_74239923/article/details/134125110
Recomendado
Clasificación