기본 요소 : 함수와 변수
기능
함수 정의 규칙
- 기능 키워드는
fun
함수를 선언하는 데 사용됩니다 - 종류 및 기능 매개 변수는 다음과 같이, 변수 선언의 뒷면에 쓰여진 이름을 입력 반환하고
- 기능은 반드시 클래스에 넣어하지, 파일의 최 외층에서 정의 할 수 있습니다
예 :
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
>>> println(max(1,2)) //打印结果:2
함수 선언 키워드 fun
함수명 뒤에 시작 : 상기 예에서 함수의 이름은 괄호 안에 파라미터리스트이어서 최대이다. 그들 사이에 콜론으로 구분 후면 목록, 이어 타입 파라미터를 반환한다. 돌아올 수없는 유형 경우, 형식은 생략 나중에 대장에 직접 반환 할 수 있습니다.
코 틀린에서 if
발현의 결과 값이있다. 함수 반환 값으로서 샘플 코드의 경우 (a> b)는 사람의 B, 이는 자바와 유사한 삼원 연산자 : (a> b) A : ? B. 에 코 틀린 if
대신 문장의 표현. 차이의 표현과 표현에 값이, 또 다른 표현의 일부로서 사용될 수 있다는 것을 문, 항상 문 코드 블록을 둘러싸는, 자신의 값을 가지고 있지 최상위 요소입니다.
함수 본문
위의 예제 코드를 쉽게. 이 함수의 내용이 하나의 표현으로 구성되어 있기 때문에, 우리는 기능의 완전한 몸으로이 표현을 사용하고, 괄호 및 반환 문을 제거 할 수 있습니다. 함수의 몸이 괄호로 작성하는 경우, 우리는 함수가 코드 블록을 가지고 있다고 말한다. 그것은 직접적인 표현을 반환하는 경우, 함수는 식의 몸이있을 것이다.
fun max(a: Int, b: Int): Int = if (a > b) a else b
위의 코드는 더 리턴 타입을 저장, 단순화 될 수있다 :
fun max(a: Int, b: Int) = if (a > b) a else b
왜 일부 기능은 반환 유형을 선언하지 않을 수 있습니다? 정적으로 입력 된 언어로, 코 틀린 각 표현을 필요로하는 것보다 컴파일러의 종류는 어떻게해야합니까? 사실, 각 변수의 종류와 식 가지며, 각 기능 타입을 반환. 그러나 식 기능 체는, 컴파일러는 신체의 표현의 함수와 함수의 리턴 형 등의 형태로 분석된다. 이 코 틀린 유형의 추론이다. (주 : 이들 반환형 및 리턴 명령문을 작성하는 표시해야하는 기능 블록 체의 반환 값으로서 생략 될 수 함수식의 타입을 반환한다.)
변수
키워드 코 틀린 두 개의 변수를 선언 :
- (값)에서 발 - 불변 참조. 발은 변수가 초기화 후 재 할당 할 수 없습니다 선언했다. 그것은 자바의 마지막 변수에 해당합니다.
- (가변)에서 VAR - 기준 변수. VAR 사용될 변수 값이 변경 될 수있다 선언. 이 선언은 자바 변수의 일반 (비 최종)에 해당한다.
기본적으로, 당신이 코 틀린 모든 변수를 선언 할 수 발 키워드만큼 사용해야 만 VAR은 필요시 교체했다.
주 : 브로 기준에도 불구하고 자신이 불변이지만, 가변 될 수있는 객체를 포인트. 예를 들어 다음 코드는 완벽하게 유효합니다 :
val languages = arrayListOf("Java") //声明不可变引用
languages.add("Kotlin") //改变引用指向的对象
문자열 템플릿 ($)
의 "+"기호 예제의 자바 동등한 문자열 템플릿 코 틀린 :
val name = "World"
//下面两行代码是等效的
println("Hello "+name)
println("Hello $name")
>>> 打印结果:Hello World
클래스 및 속성
범주
자바보다 더 간결 클래스 선언에서 코 틀린. 의는 다음과 같은 두 가지 예 정확히 상응하는 간단한 자바 빈즈 클래스와 비교하자,하지만 자바와 코 틀린에 선언했다.
/* Java */
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
/* Kotlin */
class Person(val name: String)
재산
자바에서는 필드의 조합과 그 접근 (게터, 세터)는 종종 속성이라고합니다. 발 및 var 키워드를 사용 : 코 틀린에있는이 호텔은 완전히 클래스 속성을 선언에서 필드와 접근 방법 (getter 및 setter 메소드) 교체 등의 변수를 선언, 일류의 언어 기능입니다. 읽기 전용 (유일한 방법 터링) (getter 및 setter 메소드를 함유 함) 가변 VAR 속성으로 선언으로서 브로 속성이 선언된다.
예 :
class Person(val name: String, var age: Int) //Person类声明了一个只读的name属性与可变的age属性
fun main(args: Array<String>) {
val person = Person("xiaochao",24)
// person.name = "xiaochao" //编译不通过,val修饰,是只读的(只有getter,没有setter),不可修改
person.age = 25//编译通过,var修饰,是可变的,这里赋值是调用setter方法
println("name=${person.name},age=${person.age}")//这里取值是调用getter方法
}
>>> 打印结果:name=xiaochao,age=25
위의 코드는 Person 클래스 파일에서 직접 속성을 선언 할 경우, 동일, 생성자 및 재산 호출에 문을 보여줍니다.
class Person {
val name: String = "xiaochao"
var age: Int = 0
}
fun main(args: Array<String>) {
val person = Person()
// person.name = "hello world" //编译不通过,name是val修饰的,是只读的,不可修改
person.age = 18
println("name=${person.name},age=${person.age}")
}
>>> 打印结果:name=xiaochao,age=18
사용자 접근 (게터, 세터)
당신은 사각형을 선언 가정 해, 그것은 그들이 평방 여부를 확인할 수 있습니다. 직사각형의 동일한 길이 및 폭 여부에 의해 언제든지 결정될 수있는 바와 같이, (가 사각형인지) 정보를 저장하는 별도의 필드를 필요로하지 않는다 :
class Rectangle(val height:Int,val width:Int){
// val isSquare:Boolean
// //自定义getter方法,同理也可以自定义setter方法,不过要自定义setter方法则属性必须声明为var类型
// get() {
// return height==width
// }
//可以使用表达式函数体来简化
val isSquare:Boolean
get() = height==width
}
fun main(args: Array<String>) {
val rectangle = Rectangle(20,20)
println(rectangle.isSquare)
}
>>> 打印结果:true
열거하고 "때"
열거 형 클래스 선언
자바와 마찬가지로 열거 목록의 값이 아니라 : 당신은 속성과 열거 할 방법을 선언 할 수 있습니다.
enum class Color(val r: Int, val g: Int, val b: Int) {
//下面每一个颜色都表示一个Color枚举类常量
RED(255, 0, 0), YELLOW(255, 255, 0),
ORANGE(255,165,0),INDIGO(75,0,130),
GREEN(0, 255, 0), BLUE(0, 0, 255);//这里必须要有分号
fun rgb() = (r * 256 + g) * 256 + b//给枚举类定义一个方法
}
fun main(args: Array<String>) {
println(Color.BLUE.rgb())
}
>>> 打印结果:255
기본 사용 때
fun getMnemonic(color:Color){
when(color){
Color.RED -> println("red")
Color.BLUE -> {
println("blue")
}
Color.GREEN,Color.YELLOW -> println("green or yellow")
}
}
시 본체의 함수로서 표현식
표현으로 사용하는 경우 때 함수 본문이 때 분기 최종 판단에 있어야 플러스 다른 (이 경우에, 판단 조건 색상 열거 타입이므로, 상수 선언 모든 종류의 다른 그대로, 다른 경우에는 생략 될 수있다 열거 할 다음 당신은) 다른 추가해야합니다 :
fun getMnemonic2(color:Color) =
when(color){
Color.RED -> "RED"
Color.BLUE -> {
"BLUE"
}
Color.GREEN,Color.YELLOW -> "GREEN or YELLOW"
//如果不加else则编译无法通过,因为Color下还有ORANGE与INDIGO没判断
else -> "other"
}
때 인수를
표현은, 다음 분기 조건이 어떤 부울 표현식 경우에 인수합니다.
fun mixOptimized(color1:Color,color2:Color) =
when{
(color1==Color.RED && color2==Color.YELLOW) ||
(color1==Color.YELLOW && color2==Color.RED) -> Color.ORANGE
(color1==Color.YELLOW && color2==Color.BLUE) ||
(color1==Color.BLUE && color2==Color.YELLOW) -> Color.GREEN
else -> throw Exception("Dirty color")
}
스마트 변환기 : 유형 검사 및 변환을 병합
당신은 어떤 타입의 변수를 선택하면 더 이상 사용의 유형을 확인 당신이 걸릴 수 있습니다, 다시 변환 할 필요가 없습니다. 당신은 유형 변환을 수행하는 사실 컴파일러는, 우리는이 동작을 통해 유일한 변수 지능적인 변환, 지능적인 변환이라고 부르는 is
변화를 확인 후 효과적인 경우 더 이상 발생하지 않습니다. 예를 들면 :
private val view:View? = null
fun test(){
if(view is TextView){
view.setText("这里view已经可以当成TextView使用")
}
}
을 통해 지능형 변환 is
키워드를 표현하기는 여기에 is
자바의 동등한instanceof
를 통해 캐스트 as
키 예를 나타내는 :
private val view:View? = null
fun test(){
val textview = view as TextView
textview.setText("强制转换")
}
루프
루프의 기본 사용
for (i in 0..10) { //从0开始遍历到10
println(i)//0,1,2,3,4,5,6,7,8,9,10
}
우리 코 틀린 간격의 간격을 나타내는 .. 사용 연산자 표현 루프 루프 단순한 사용을 반드시보다도 그 의미 간격 0-10에 대한 상기 루프. 이 개념 간격 이외에, 상기 반복 단계는 코 틀린 개념을 포함한다. 이러한 상기 코드 각주기 간격 디폴트의 크기를 간단하게 이해할 단계 크기가 표시되지 지정 단계는, 디폴트는 0 내지 하나 증분 사이클의 단계 (10)의 간격이, 우리는 단계로 지정된 2, 출력 결과 0,2,4,6,8,10 것이다. 2 단위로 단계로 이동합니다. 아래의 코드를보고 :
for (i in 0..10 step 2) {
println(i)//0,2,4,6,8,10
}
우리는 10-0에서 감소 할 경우 어떻게 쓰기? 아래의 코드를보고 :
for (i in 10 downTo 0) { //这里我们同样可以设置步长
println(i)
}
우리는 그것의 쓰기에 대한 루프에서 코 틀린의 한 종류를 살펴 보자, 0-10을 출력 할 사이클 범위 위 0..10 알고있다 :
for (i in 0 until 10){
println(i)//0,1,2,3,4,5,6,7,8,9
}
상기 참고 until
로 0..10이 제제의 차이 until
만 0에서 9와 같은 방법은 지문, 0..10 및 0-10를 인쇄한다.
반복 횟수 : 간격 시퀀스 번호
인터벌 간격이 두 값 사이에 본질적으로, 두 값은 보통 숫자 : 시작 값이 최종 값. 사용 ..
의 간격을 나타내는에 연산자를 :
val oneToTen = 1..10
코 틀린 간격 함유 닫혀 참고 번째 값은 항상 부 섹션을 의미한다.
당신은 가장 기본적인 것은 루프 반복의 모든 값의 범위에서 정수를 할 수 있습니다. 당신이 구간에있는 모든 값을 반복 할 수있는 경우, 간격은 열 수라고합니다.
루프 반복 맵
val maps = TreeMap<Char, String>()
for (c in 'A'..'F') {
val value = Integer.toBinaryString(c.toInt() )//A-F的二进制值
maps[c] = value //c为键,value为值
}
for ((key, value) in maps) {
println("$key = $value")
}
//打印结果
A = 1000001
B = 1000010
C = 1000011
D = 1000100
E = 1000101
F = 1000110
에서 확인하고 설정 범위의 멤버 키워드를 사용하여
예를 들어, 나는 0,10 5 사이의 숫자는 코드는 다음과 같다 여부를 확인하려면 :
fun main(args: Array<String>) {
println(testIn(5))//true
}
fun testIn(i:Int):Boolean{
//这里in可以取反,!in
return i in 0..10
}
나는 목록을 확인하려는 목록에 값이 같은 다른 예를 들어, 같은, 다음과 같이 코드가,에서 확인할 수 있습니다 :
fun main(args: Array<String>) {
println(testIn("xiaochao"))//true
}
fun testIn(name: String): Boolean {
val listdata = ArrayList<String>()
listdata.add("xiaochao")
listdata.add("xiaowang")
listdata.add("laowang")
return name in listdata
}
코 틀린 예외
자바 코 틀린 예외가 크게 다르지 않다. 그러나 코 틀린은의 사용하면 try catch
시간이 있지만 표현으로 사용할 수 있습니다.
fun testException(str:String):Int{
val number = try{
Integer.parseInt(str)
}catch (e:NumberFormatException){
0
}
return number
}
fun main(args: Array<String>) {
println(testException("55")) //打印结果:55
println(testException("hello world")) //打印结果:0
}
개요
fun
키워드는 함수를 선언하는 데 사용됩니다.val
키워드 및var
키워드는 변수와 변수 읽기 전용 변수를 선언하는 데 사용됩니다.- 문자열 템플릿을 사용하면 문자열 링크의 성가신 세트를 방지합니다. 변수 이름 앞에
$
접두사 또는${ }
식에 의해 둘러싸여 값 문자열로 주입된다. - 친숙한는
if
식의 반환 값입니다. when
표현은 자바와 유사하다switch
하지만 더 강력한.- 당신은 체크 변수는 몇 가지 유형이 후 명시 적으로 유형을 변환 할 필요가 없습니다 : 컴파일러는 자동으로 완료 할 수 있도록 스마트 스위치를 사용합니다.
- 대한 동안 수행-동안 루프가 자바와 비슷하지만, 지금은지도, 또는 시간의 주제에 따라 요구되는 반복의 또 다른 세트를 반복해야 할 때 특히 더 편리한 재활용.
- 간결한 구문 1..5이 범위를 생성한다. 간격 수열은 루프 코 틀린 통합 문법 추상화 동일한 세트를 허용하고, 또한 사용될 수있다
in
구름 알고리즘 및!in
체크 운영자 지정 범위 내의 값인지. - 코 틀린은 (기능 후에 표시 예외를 throw 즉없이) 예외를 던질 수있는 함수를 선언 할 필요가 없습니다 제외하고 예외 처리에 코 틀린와 자바는 매우 유사하다.