Android Kotlin 개발 실례(Hello World!)문법

21233 단어 AndroidKotlin
Android Kotlin 개발 실례 및 문법 상세 설명
머리말
Kotlin 은 자바 가상 컴퓨터 에서 실 행 된 정적 형 프로 그래 밍 언어 로 주로 러시아 상 트 페 테 르 부 르 크 의 JetBrains 개발 팀 이 발전 한 프로 그래 밍 언어 이다.이 언어 는 몇 가지 우세 가 있다.
1.간결 함
그것 은 네가 써 야 할 모델 코드 의 수 를 크게 줄 였 다.
2.안전
빈 포인터 이상 등 모든 종류의 오 류 를 피하 십시오.
3.통용
서버 엔 드 프로그램,안 드 로 이 드 프로그램 또는 브 라 우 저 에서 실행 되 는 전단 프로그램 을 구축 합 니 다.
4.상호작용 성
100%자바 상호 작용 성 을 통 해 JVM 기 존 프레임 워 크 와 라 이브 러 리 를 이용 합 니 다.
배치 하 다.
Google AndroidStudio 개발 도구 에서 Kotlin 이라는 우수한 개발 언어 를 사용 하려 면 플러그 인 을 설치 하고 설치 플러그 인 인터페이스 에서 Kotlin 을 검색 한 다음 설치 해 야 합 니 다.그 다음 gradle 파일 에 다음 설정 을 추가 합 니 다.

apply plugin:'kotlin-android'
apply plugin:'kotlin-android-extensions'

dependencies {
 compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

프로젝트 gradle 파일

buildscript {
 ext.kotlin_version = '1.1.1'
 repositories {
  jcenter()
 }
 dependencies {
  classpath 'com.android.tools.build:gradle:2.3.1'
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

  // NOTE: Do not place your application dependencies here; they belong
  // in the individual module build.gradle files
 }
}

위의 설정 을 완성 하면 우 리 는 즐겁게 놀 수 있 습 니 다.
Kotlin 예시
우선 저 희 는 예전 과 마찬가지 로 안 드 로 이 드 프로젝트 를 만 들 고 Activity 를 자동 으로 만 든 후에 자바 류 를 만 듭 니 다.

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);

  FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
  fab.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
      .setAction("Action", null).show();
   }
  });
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.menu_main, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // Handle action bar item clicks here. The action bar will
  // automatically handle clicks on the Home/Up button, so long
  // as you specify a parent activity in AndroidManifest.xml.
  int id = item.getItemId();

  //noinspection SimplifiableIfStatement
  if (id == R.id.action_settings) {
   return true;
  }

  return super.onOptionsItemSelected(item);
 }
}
public class Test {
 private static String str = null;

 public static void main(String[] args) {
  str = "Code4Android";
  System.out.println(str);
 }
}

그럼 위의 코드 는 kotlin 으로 이 루어 지면 어떤 모습 일 까요?아직 Kotlin 코드 를 쓸 수 는 없 지만 플러그 인 을 설치 한 후 AS 에 서 는 Kotlin 코드 를 자동 으로 변환 하 는 기능 을 제공 합 니 다.
这里写图片描述
변 환 된 Kotlin 코드

class MainActivity : AppCompatActivity() {

 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
  val toolbar = findViewById(R.id.toolbar) as Toolbar
  setSupportActionBar(toolbar)

  val fab = findViewById(R.id.fab) as FloatingActionButton
  fab.setOnClickListener { view ->
   Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
     .setAction("Action", null).show()
  }
 }

 override fun onCreateOptionsMenu(menu: Menu): Boolean {
  // Inflate the menu; this adds items to the action bar if it is present.
  menuInflater.inflate(R.menu.menu_main, menu)
  return true
 }

 override fun onOptionsItemSelected(item: MenuItem): Boolean {
  val id = item.itemId
  if (id == R.id.action_settings) {
   return true
  }
  return super.onOptionsItemSelected(item)
 }
}


object Test {
 private var str: String? = null

 @JvmStatic fun main(args: Array<String>) {
  str = "Code4Android"
  println(str)
 }
}

주의:AS 가 제공 하 는 자바 코드 자동 변환 기능 은 쉽게 사용 하지 말고 성숙 한 프로젝트 로 전환 하지 마 십시오.필요 하 다 면 우리 스스로 재 구성 하여 실현 해 야 합 니 다.그렇지 않 으 면 의사 가 없 는 일이 기다 리 고 있 을 것 이다.왜냐하면 전환 은 그렇게 지능 적 이지 않 기 때문이다.위의 코드 는 단지 Kotlin 코드 가 어떤 모습 인지 간단하게 익히 라 는 것 일 뿐 입 니 다.그 다음 에 우 리 는 먼저 Kotlin 의 기본 문법 을 배 워 보 겠 습 니 다.쉽게 손 에 넣 을 수 있 을 거 라 고 믿 습 니 다.
Hello World!
저 희 는 간단하게"Hello World!"출력 프로그램 시작.새 자바 파일 과 유사 합 니 다.다음 그림 에서 Kotlin File/class 를 선택 하여 Kotlin 파일 을 만 듭 니 다.
这里写图片描述

package com.learnrecord

/**
 *Created by Code4Android on 2017/4/21.
 */

var str: String = ""

fun main(args: Array<String>) {
 str = "Hello World!"
 println(str)
}

위 코드 는 간단 한 출력 문자열 인"Hello World"입 니 다.package 뒤 에는 가방 이름 이 있 습 니 다.자바 파일 과 의 차 이 를 알 수 있 습 니 다.가방 이름 뒤에 분점 이 없습니다."결말Kotlin 문법 에서 문장의 끝 에 분점 이 있 지 않 습 니 다.";".
Kotlin 에서 변 수 는 두 가지 유형 이 있 습 니 다.val 수식 변 수 는 읽 기 변수 즉 한 번 만 할당 할 수 있 고 다시 할당 할 때 컴 파일 오류 가 발생 합 니 다.
만약 우리 가 값 을 여러 번 수정 해 야 한다 면 var 를 사용 해 야 합 니 다.위의 var str:String="에서 str 는 변수 이름 입 니 다.:String 은 이 변 수 는 String 형식 변수 이 고 그 다음은 할당 문 입 니 다.우 리 는 var str="생명 변수 유형 을 생략 하고 부 여 된 값 에 따라 유형 을 자동 으로 추정 할 수 있 습 니 다.만약 우리 가 아래 의 할당 문 구 를 str=null 로 사용한다 면 null 은 할당 할 수 없 는 것 을 발견 할 수 있 습 니 다.이것 이 바로 Kotlin 의 특성 입 니 다.만약 우리 가 null 을 할당 하고 싶다 면 var str:String?="으로 수정 할 수 있 습 니 다.
fun 은 함수 생명 입 니 다.이 main 함 수 는 우리 자바 의 main 방법 과 마찬가지 로 프로그램 이 실행 하 는 입구 입 니 다.println 은 인쇄 출력 입 니 다.
Kotlin 성명 형식
Kotlin 에는 다음 과 같은 몇 가지 Number 유형 이 있 는데 그들 은 모두 Number 추상 류 를 계승 한다.
Float(32 비트),Double(64),Int(32),Byte(8),Short(16),Long(64,유형 은 대문자 L,예 를 들 어 12L),Any(임 의 유형),배열 유형 Array 는 들 어 오 는 일반적인 데이터 에 따라 자동 으로 유형 을 매 칭 합 니 다.Kotlin 은 ByteArray,CharArray,ShortArray,IntArray,LongArray,FloatArray,DoubleArray,BooleanArray 등 지정 한 유형의 Array 도 제공 합 니 다.배열 형식 에 서 는 get(index),set(index,value)및 iterator()방법 을 제공 합 니 다.

 val iArray: IntArray = intArrayOf(1, 2, 3)
 val sArray: Array<String> = Array<String>(3, { i -> i.toString() })
 val anyArray: Array<Any> = arrayOf(1, "2", 3.0, 4.1f) //                 
 val lArray: LongArray = longArrayOf(1L, 2L, 3L)
함수.
우 리 는 먼저 간단 한 수치 구 화 함 수 를 실현 합 니 다.통용 실현 방법 은 다음 과 같 습 니 다.

 fun sum(a: Int, b: Int): Int {
  return a + b
 }
두 개의 Int 형 수 치 를 입력 합 니 다.sum 은 함수 이름 입 니 다.괄호 뒤의:Int 는 이 함수 가 Int 의 값 을 되 돌려 주 고 함수 체 에서 두 개의 숫자 를 더 하고 되 돌려 줍 니 다.Kotlin 에서 표현 식 은 함수 체 로 도 사용 할 수 있 습 니 다.컴 파일 러 는 반환 형식 을 추정 할 수 있 고 간략화 할 수 있 습 니 다.

 fun sum(a: Int, b: Int) = a + b
표현 식 을 함수 체 로 이해 하기 위해 서 우 리 는 함수 하 나 를 만들어 두 수의 최대 치 를 얻 을 수 있 습 니 다.다음 과 같 습 니 다.

 fun max1(a:Int,b:Int)=if (a>b) a else b
주의해 야 할 것 은 if 뒤에 여러 표현 식 이 있다 면 다음 과 같 습 니 다.

 fun max1(a:Int,b:Int)= if (a > b) {
  println(a)
  a
 } else {
  println(b)
  //     println(b)  b   ,     kotlin.Unit    ,                  
  b
 }
 println(max1(1,3))
괄호 안의 표현 식 순 서 는 되 돌아 오 는 값 과 유형 을 결정 합 니 다.
만약 우리 의 방법 체 가 인쇄 문자열 일 뿐 값 을 되 돌려 주지 않 는 다 면

 fun printInt(a: Int): Unit {
  println(a)
 }
Unit 은 우리 자바 의 void 와 유사 합 니 다.즉,반환 값 이 없습니다.이때 우 리 는 생략 할 수 있 습 니 다.

 fun printInt(a: Int) {
  println(a)
 }
함수 체,방법 또는 클래스 등 자바 와 마찬가지 로 수정자 도 있 습 니 다.다음 과 같 습 니 다.
  • abstract//추상 류 표시
  • final//표시 류 계승 불가,기본 속성
  • enum//표시 류 는 매 거 진
  • open//클래스 계승 가능,클래스 기본 값 은 final
  • annotation//주해 류
  • private//같은 파일 에서 만 볼 수 있 습 니 다
  • proctected//같은 파일 이나 하위 클래스 를 볼 수 있 고 수식 할 수 없 는 클래스
  • Public//모든 호출 된 곳 을 볼 수 있 습 니 다
  • internal//같은 모듈 에서 볼 수 있 습 니 다.만약 에 클래스 에 수정자 가 없 으 면 기본 값 은 이 수정자 이 고 역할 영역 은 같은 응용 모듈 로 보호 역할 을 하 며 모듈 의 외부 호출 을 방지 합 니 다.
  • 조작 부호
    직접 코드 는 아래 와 같다.
    
     //    shl    Int Long
     var a: Int = 4
     var shl: Int = a shl (1) //Java        <<
     var shr: Int = a shr (1) //Java        >>
     var ushr: Int = a ushr (3) //     ,   0 >>>
     var and: Int = 2 and (4) //      &
     var or: Int = 2 or (4) //      |
     var xor: Int = 2 xor (6) //       ^
     print("
    shl:" + shl + "
    shr:" + shr + "
    ushr:" + ushr + "
    and:" + and + "
    or:" + or + "
    xor:" + xor)
    출력 정보
    
    shl:8
    shr:2 
    ushr:0
    and:0
    or:6
    xor:4
    
    위의 일부 조작 부 호 는 논리 적 조작 부호 에 도달 할 수 있 습 니 다.우리 가 Boolean 을 사용 할 때,or()는||,and()는&,xor()와 같 습 니 다.조작 부호 양쪽 이 반대 일 때 true 이 고,그렇지 않 으 면 false,not()일 때 반 대 됩 니 다.
    배열 스 트 리밍 및 제어 문
    배열 옮 겨 다 니 기
    
     fun forLoop(array: Array<String>) {
      //           (  java foreach)
      for (str in array) {
       println(str)
      }
      //Array   forEach  
      array.forEach {
       println(it)
       }
      //array.indices     
      for (i in array.indices) {
       println(array[i])
      }
      //(  javafor(int i=0;i<arry.length;i++))
      var i = 0
      while (i < array.size) {
       println(array[i++])
      }
     }
    
    유형 판단 시 사용
    
    fun whenFun(obj: Any) {
      when (obj) {
       25 -> println("25")
       "Kotlin" -> println("Kotlin")
       !is String -> println("Not String")
       is Long -> println("Number is Long")
       else -> println("Nothing")
      }
     }
    
    is 와 자바 에서 인 스 턴 트 of 는 하나의 역할 로 어떤 유형 인지 판단 합 니 다.!is 즉 판단 은 어떤 유형 이 아니다.
    
    //@  label,               :i in 0..2   java  for(int i=0;i<=2;i++)  
     loop@ for (i in 0..2) {
      for (j in 0..3) {
       println("i:" + i + " j:" + j)
       if (j == 2)
       //continue@loop//      ,      
        break@loop //      label ,      
      }
     }
    
    역순 출력 은 다운 투 입 니 다.
    
     //    5 4 3 2 1 0
     for (i in 5 downTo 0) {
      println(i)
     }
     //        
      for (i in 1..5 step 3) print(i) //    14
      //step downTo    
      for (i in 5 downTo 1 step 3) print(i) //  52
    
    종류 와 매 거
    
    /*** constructor:    
     * constructor    ( :private) ,constructor    :
     *          ,             ,          public 
     *   primary constructor        ,     init         ,
     *                      
     */
    open class People private constructor(var id: String, var name: String) {
     //         :
     var customName = name.toUpperCase() //     
     //     ,  constructor    ,     primary constructor,  this   
     constructor( id: String, name: String, age: Int) : this(id, name) {
      println("constructor")
     }
     init {
      println("     ,   constructor  ")
     }
     //  open  ,     
     open fun study() {
      print("study")
     }
     //People    ":"      ,            
    class Student(id: String, name: String) : People(id, name) {
     var test: Number = 3
     private var name1: String?
      get() {
       return name1
      }
      set(value) {
       name1 = value
      }
     //override     ,         。       ,     final      
     override fun study() {
      super.study()
     }
    }
    
    }
    데이터 클래스 는 데 이 터 를 저장 하 는 데 사용 되 며,POJO 클래스 와 유사 하 며,data 키 워드 를 사용 하여 정의 합 니 다.컴 파 일 러 는 기본적으로 데이터 클래스 에 다음 과 같은 네 가지 방법 을 생 성 합 니 다.
  • equals()
  • hashCode()
  • toString()
  • copy()
  • 데이터 클래스 를 통 해 Kotlin 의 간결 성 을 볼 수 있 습 니 다.저 희 는 Staff 류 를 만 들 었 습 니 다.String 형식의 name,position 와 범 형 T 가 있 습 니 다.
    자바 구현 코드:
    
    public class StaffJ<T> {
     private String name;
     private String position;
     private T age;
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public String getPosition() {
      return position;
     }
    
     public void setPosition(String position) {
      this.position = position;
     }
     public T getAge() {
      return age;
     }
     public void setAge(T age) {
      this.age = age;
     }
    }
    
    
    Kotlin 데이터 클래스:
    
    data class Staff<T>(var name: String, val position: String,var age:T)
    비 교 를 통 해 우 리 는 장점 을 알 수 있 고 한 줄 의 코드 가 실현 되 며 구체 적 으로 사용 되 었 다.
    
     var staff = Staff("code4Android","Android   ","22") //     
    이름 을 가 져 오 는 staff.name 과 같은 속성 을 가 져 오 려 면 할당 값 은 staff.name="code4Android 2"입 니 다.이렇게 할당 할 수 있다 고 했 는데 손 을 댄 동료 가 왜 제 가 잘못 보 고 했 는 지 말 했 습 니 다.다음 과 같 습 니 다.
    
     staff.position="  "
    컴 파일 이 잘못 되 었 습 니 다.앞에서 우 리 는 val 수식 의 속성 은 한 번 만 할당 할 수 있다 고 말 했 습 니 다.그러면 여기 서 val 수식 의 속성 은 다시 할당 할 수 없습니다.
    
    fun main(arg:Array<String>){
     var staff = Staff("code4Android","Android   ","22") //     
     staff.name="code4Android2"
     var staff1=staff.copy()
     //  copy          ,          ","  
     var staff2=staff.copy(name="ccc",position = "kotlin")
     println("name:${staff2.name} position:${staff2.position} age ${staff2.age}")
     //staff.position="Kotiln" //val      
     var anotherStaff= Staff("code4Android","Android   ",22) //     
    
     println("staff toString(): ${staff.toString()} anotherStaff toString(): ${anotherStaff.toString()}")
     println("staff hashCode(): ${staff.hashCode()} anotherStaff hashCode(): ${anotherStaff.hashCode()}")
     println("staff is equals another staff ? ${staff.equals(anotherStaff)}")
    }
    
    
    위 에 문자 템 플 릿 을 사 용 했 습 니 다.Kotlin 에는 두 가지 문자 템 플 릿 형식 이 있 습 니 다.$<변수>,${<변수>}
    
     var name:String="Code4Android"
     println("     $name")
     println("     ${name}")
    
    
    /**
     * java         ;kotlin       ,       -object expressions
     */
    open class KeyBord{
     open fun onKeyEvent(code:Int):Unit = Unit
    }
    
     
    /**     **/
    var key=object :KeyBord(){
     override open fun onKeyEvent(code:Int):Unit = Unit
    }
    
    
    매 거
    
    enum class Color{
     RED,BLACK,BLUE,GREEN,WHITE
    }
    fun display(){
     var color:Color=Color.BLACK
     Color.valueOf("BLACK") //     name    ,      ,   IllegalArgumentException
     Color.values() //      ,     
     println(color.name)////      
     println(color.ordinal)//                  ,0  
    }
    
    Kotlin 에서 지원 하 는 방법 을 매 거 합 니 다.
    넓히다
    
    /**
     * fun receiverType.functionName(params){
     *body
     *}
     * receiverType :       
     * .   :       
     * functionName :          ,
     * params  :           ,   
     *        ,    visibility modifiers  
     *              ,                。
     *      ,             ,       ,           。
     */
    class Employee(var name: String) {
     fun print() {
      println("Employee")
     }
    }
    
    //    
    fun Employee.println() {
     print("println:Employee name is $name")
    }
    
    
    /**
     *          
     */
    fun Any?.toString1(): String {
     if (this == null)
      return "toString1:null"
     else {
      return "toString1" + toString()
     }
    }
    
    /**
     *     
     *                    ,
     *                     .   ,               .
     *                             ,          
     *      val       var.       var,        ,
     *           ,            。
     */
    val Employee.lastName: String
     get() {
      return "get:"+name
     }
    
    
    쓰다
    
    fun main(arg: Array<String>) {
     var employee = Employee("Code4Android")
     employee.print()
     employee.println()
     println(employee.toString1())
     println(employee.lastName)
    }
    
    대리
    
    **
     *      
     */
    interface Base {
     fun display()
    }
    
    /**
     *     
     */
    open class BaseImpl : Base {
     override fun display() = print("just display me.")
    }
    
    /**
     *    ,  :     by    
     *               
     * class Drived(base: Base) : Base by base,BaseImpl()
     */
    class Drived(base: Base) : Base by base
    
    //  
    fun show() {
     var b = BaseImpl()
     var drived = Drived(b)
     drived.display()
    
    }
    
    **
     *     :
     *    :Lazy
     *    :Delegates.observable()
     *     :Delegates.notNull<>()
     */
    class Water {
    
     public var weight:Int by Delegates.notNull()
     /**
      *     
      */
     public val name: String by lazy {
      println("Lazy.......")
      "Code4Android"
     }
     public var value: String by Delegates.observable("init value") {
      d, old, new ->
      println("$d-->$old->$new")
     }
    }
    
    fun main(arg: Array<String>) {
     show()
     var water = Water()
     println(water.name)
     println(water.name)
     water.value = "11111"
     water.value = "22222"
     water.value = "33333"
     println(water.value)
     println(water.value)
     //       IllegalStateException: Property weight should be initialized before get.
     water.weight=2
     print(water.weight)
    }
    
    
    연산 자:
    
    val String.lastChar: Char
     get() = this[this.length - 1]
    
    class A(val p: Int)
    
    
    
     //1,           :
     val c = Student::class
     //2,    
     fun isOdd(x: Int) = x % 2 != 0
     val numbers = listOf(1, 2, 3)
     println(numbers.filter(::isOdd)) 
    
     //3,    (    main          )
     println(::x.get())
     ::x.set(2)
     println(x)
     //4,::x        KProperty<Int>      ,        get()                 
     val prop = A::p
     println(prop.get(A(1))) 
    
     //5,      
     println(String::lastChar.get("abc")) 
    
     //6,  java     
     println(A::p.javaClass),
     var f: Array<Field> = A::p.javaClass.declaredFields
    
    
    반생 대상
    동반 대상(copanion object)은 자바 의 정적 키워드 static 와 유사 합 니 다.Kotlin 에 서 는 이 키워드 가 아 닌 동반 대상,구체 적 인 용법 이 있 습 니 다.
    
    open class People constructor(var id: String, var name: String){
     //         :
     var customName = name.toUpperCase() //     
    
     //  constructor    ,     primary constructor,  this   
     constructor( id: String, name: String, age: Int) : this(id, name) {
      println("constructor")
     }
    
     init {
      println("     ,   constructor  ")
     }
     //,Kotlin class    static  ,      companion object   static  ,
     //     platformStatic        static  ,        ,
     companion object {
      val ID = 1
     }
    }
    
    
    사용 하면 바로 People.ID.
    단일 모드
    Kotlin 에서 object 수식 류 를 사용 할 때...이 종 류 는 단일 대상 이다.
    
    /**
     *   object   ,         ,          ,            ,        
     * Place.doSomething() //       
     */
    object Singleton {
     fun doSomething() {
      println("doSomething")
     }
    }
    
    
    /**
     *       ,      ,          ;                 。
     *
     *         object         ,                              ,       
     *     companion    ,          ,       
     * MyClass.doSomething() //           
     */
    class MyClass {
     companion object Singleton {
      fun doSomething() {
       println("doSomething")
      }
     }
    }
    
    
     읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
    원본 다운로드:http://xiazai.jb51.net/201705/yuanma/KotlinForAndroid(jb51.net).rar

    좋은 웹페이지 즐겨찾기