kotlin中文文档:http://www.kotlindoc.cn/ClassesAndObjects/Classes-and-Inheritance.htmlhtml
例如继承FragmentPagerAdapter时声明一个构造方法——java
class ViewPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) { init { //初始化 } }
当声明多个构造方法时,如ide
public class LoadMoreRecyclerView extends RecyclerView { public LoadMoreRecyclerView(Context context) { super(context); } public LoadMoreRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); } public LoadMoreRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } }
写做kotlin时,将主构造函数写在类名后(函数类不使用初始化时可将大括号去掉):函数
class LoadMoreRecyclerView(context: Context?) : RecyclerView(context) { constructor(context: Context, attrs: AttributeSet):this(context){ } constructor(context: Context, attrs: AttributeSet, defStyle: Int):this(context, attrs) }
若是是一个实体类,须要实现自定义的构造方法:this
constructor(id: Long, price: Double, url: String): this() { this.id = id this.price = price this.url = url }
定义静态方法时用companion object{}包裹在方法外层url
①!!spa
a!!.foo()debug
//至关于java: code
if(a!=null){ a.foo(); }else{ throw new KotlinNullPointException(); }
②?.orm
a?.foo()
//至关于java:
if(a!=null){ a.foo(); }
1.继承:
java——
public class MainActivity extends BaseActivity{}
kotlin——
class MainActivity : BaseActivity(){}
2.实现:
java——
public class HomeBase implements Parcelable { }
kotlin——
class HomeBase() : Parcelable{}
注意:HomeBase后面跟的小括号即表示一个无参数的构造函数,参见上面说的的《声明构造方法》
3.同时继承且实现,逗号隔开就好了:
java——
public class MainActivity extends BaseActivity implements MainContract.View {}
kotlin——
class MainActivity : BaseActivity(), MainContract.View {}
kotlin默认的内部类是静态内部类,不能持有外部类的状态(属性、方法等)
给内部类加上inner关键词以后,就会变成非静态内部类
class HomeAdapter{ private inner class SpanSizeLookup : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return list[position].spanCount } } }
在非静态的方法中调用时,须要加上open,即
open inner class SpanSizeLookup : GridLayoutManager.SpanSizeLookup() {
}
当直接返回到方法外时
fun method{ if (isInEditMode) lit@{ return@lit } }
url == null ? "" : url 可写做 url ?: "" holder instanceof HeadHolder 可写做 holder is HeadHolder
在new一个变量并调用其实现方法时(相似注册监听)
MarqueeLayoutAdapter<HomeBase> topAdapter = new MarqueeLayoutAdapter<HomeBase>(headlineList) { @Override protected void initView(View view, int position, HomeBase item) { ((TextView) view).setText(item.getName()); } };
可写做
val topAdapter = object : MarqueeLayoutAdapter<HomeBase>(headlineList) { override fun initView(view: View, position: Int, item: HomeBase) { (view as TextView).text = item.name } }
kotlin中一样有修饰符,与java一样的public,private,protected,kotlin中默认为public,因此能够省略不写,还有一个java中没有的interval修饰符
internal 修饰类的方法,表示这个类方法只适合当前module使用,若是其余module使用的话,会找不到这个internal方法或者报错
好比在moduleA中建立方法methodA B:
class Activity_A() { fun methodA(){ Log.i("debug=","methodA") } internal fun methodB(){ Log.i("debug=","methodB") } }
而后在moduleB中调用:
void callMethod(){ new Activity_A().methodA(); //正常。
new Activity_A().methodB();//报错,usage of kotlin internal declaration from different module
}
通常都会有一个fragment的基类,如:
abstract class BaseFragment<T : BasePresenter> : Fragment(){ ... }
当在java中的使用以下时:
private ArrayList<BaseFragment> fragments;
在kotlin中的用法照理(对,照个人理)来讲是这样:
val tabs = ArrayList<BaseFragment>()
可是会报错
One type argument expected for class BaseFragment<T : BasePresenter> : Fragment
提示须要匹配基类的参数类型,即val tabs = ArrayList<BaseFragment<SomePresenterType>>()
val tabs = ArrayList<BaseFragment<BasePresenter>>()
而BasePresenter若是还有继承,如
interface BasePresenter<T : BaseView> {}
那么就得再加上basePresenter的参数类型:
val tabs = ArrayList<BaseFragment<BasePresenter<BaseView>>>()
在kotlin中已经再也不使用findViewById了,而是直接使用控件的id名:
java中:
mTextView = view.findViewById(R.id.textl_view);
mTextView.setText("Shirley");
kotlin:
textl_view.text = "Shirley"
这里就直接上代码吧
java:
switch (currentState) { case NORMAL_STATE: if (mNormalView == null) { return; } mNormalView.setVisibility(View.INVISIBLE); break;
case ERROR_STATE: mErrorView.setVisibility(View.GONE); default: break; }
kotlin:
when (currentState) { NORMAL_STATE -> { if (mNormalView == null) { return } mNormalView.visibility = View.INVISIBLE } ERROR_STATE -> mErrorView.visibility = View.GONE else -> { } }
12. xx.class的表达
java:
Intent intent = new Intent(this, AboutActivity.class); startActivity(intent);
kotlin:
val intent = Intent(this, AboutActivity::class.java) startActivity(intent)