Kotlin入门(三)——类、对象、接口
本章内容包括:
类的基本要素
类的继承结构
修饰符
接口
0. 前言在上一篇的末尾,我们提到了Kotlin的包和导入。
原本我是准备把这篇的内容也放在上一篇的,但是后来一想,这张的内容会很有点多,放进去的话可能会导致上一篇太大了,所以就单独分成一篇了。
在说类之前,我们先来看下一个类的Java版和Kotlin版的对比,这个会一下子就让你对Kotlin感兴趣。
我们现在有一个需求,需要定义一个JavaBean类Person,这个类中包含这个人的姓名、电话号码以及地址。
我们先来看下Java的实现:123456789101112131415161718192021222324252627282930313233343536373839404142434445public class Person { private String firstName; private String lastName; private String telephone; private String address; public Person(String ...
Kotlin入门(二)——基本类型、包
本章内容包括:
kotlin的基本类型
包
类与对象
0. 前言在上篇文章我们涉及到了kotlin的一些最基本的语法内容,并完成了kotlin的HelloWorld。但是上篇我们在谈到类的时候,说了只介绍下最基本的类,于是在这篇,我们就着重看下类和对象。(更新:由于类和对象的内容过多,我会放在下一篇来说这个)
但是在说到类之前,我们先来看下基本类型。
1. kotlin的基本类型在说基本类型之前,我们先提及一个Kotlin的基本定义,也是Kotlin和Java最明显的区别之一:
在kotlin中,所有的东西都是对象那么熟悉Java的同学可能要说了:不对啊,你不是说Kotlin的基础是Java吗,那么Java的基本类型不是对象啊,那Kotlin的基本类型怎么可能不是对象了。
但是事实就是,Kotlin的基本类型,都是对象。
Kotlin的基本类型也被分为了:数字、字符、布尔值、数组与字符串。我们就来逐一谈下。
1.1 数字1.1.1 整型和Java一样,Kotlin也有四种不同大小的整型类型:
类型
大小(比特)
最小值
最大值
Byte
8
-128
127
...
Kotlin入门(一)——基本要素
Kotlin入门(一)——基本要素
本章内容包括:
kotlin的HelloWorld
变量、控制流、函数
包和类(最基础的内容,具体的后面会介绍)
智能转换
0. 前言我之前写过一篇《Kotlin入门》博客,但是一方面是这篇博客写的比较早,写的时候单纯是为了学习anko而写的,所以感觉写的并不好,另一方面,在写的时候只是写了点基础知识,当时也没有系统的学习kotlin。
所以在看完kotlin实战后,就想回过头来写一篇总结博客
写这个主要是为了几个目的:
对于看我博客的人来说有一个更加系统更加全面更加完善的kotlin入门指南。
对于我自己,单纯的看书还是不够好,就写一篇总结博客总结下书本中的知识。
注:由于我之前只会Java,并且目前主要是在做Android开发,所以我的博客更多的会将kotlin与Java进行比较,并且可能会偏向Android开发中的实践。
1. Hello World万恶之源,我们从程序员的第一个程序“Hello World”开始。
我们先来看下kotlin版的Hello World是怎么写的,如果你之前学习过Java,你会立马被kotlin语法的简 ...
Android编译变体
编译流程我们都知道Android编译就是将我们自己写的Java文件编译成了.apk,但是他到底是如何将java编译成.apk的呢?
我们引入一张Google官方的流程图:
我们可以看到,一个APP编译的大致流程就是这样的:
先将项目的源代码编译成dex文件(Android虚拟机可识别的字节码文件,至于为啥不是.class,最根本的原因就是Android并没有直接使用Java的虚拟机。并且单个dex文件可被引用的方法总数被限制为65536,如果我们的项目过于庞大超出这个限制时,可能会被打包成多个dex文件),其中这个源代码除了我们自己写的代码之外还包括我们导入的依赖库的代码;并将其他除源文件之外比如资源文件等等所有文件都转成编译的资源。
APK打包器将dex文件和编译的资源组合成单个APK,不过必须先为APK签名才能将打包的应用安装在设备上。
APK打包器通过调试或者发布密钥库为APK签名:
如果编译的版本是调试版本,打包器会使用调试密钥库为应用签名。AndroidStudio会自动使用调试密钥库配置新项目。
如果编译的版本是最终正式发布版本,则需要你自己提供签名信息,然后生成密钥用于 ...
Java锁机制
悲观锁和乐观锁乐观锁和悲观锁都是一种广义上的概念。
对于同一个数据的并发操作,悲观锁确实很悲观,它时时刻刻都非常担心自己在读取或者写入数据的时候有其他线程来修改数据,所以为了安心,他一般就直接从读取数据的时候就加锁,确保自己操作的时候不会被其它线程打扰。最典型的悲观锁就是synchronized和Lock。
而乐观锁确实很乐观,它认为自己在操作数据的时候是不会有其他线程来修改数据的,所以丝毫不担心,完全不会添加锁。只是在更新数据的时候判断有没有其他线程更改了数据,如果这个数据没有被更新,当前线程再把自己的数据写入;如果数据已经更新,则根据不通过的实现方式执行不同的操作。
看到这,大家就懂了,乐观锁不就是缓存一致性以及CAS算法嘛。
那什么是CAS算法呢?
CAS,比较与交换,一中著名的无所算法。CAS的主要就设计到三个值:
需要读写的内存值V
进行比较的值A
要写入的新值B
当且仅当V的值等于A时,CAS通过原子操作去用新值B来更新V的值,否则不会执行操作。
但是CAS也有缺点:
循环时间长开销大:如果一个线程已知都发现自己的值都不是A,那么他会已知自旋
只能保证一个共享变量的原 ...
深入理解JVM-类加载器
1. 概念虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。
一般来说,Java 虚拟机使用 Java 类的方式如下:
Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成字节码(.class 文件)。
类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。
实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。更详细的内容可以参考上一篇文章中讲类加载过程中的加载阶段时介绍的几个例子(JAR包、Applet、动态代理、JSP等)。
2. 类与类加载器类加载器虽然只用于实现类的加载动作,但他在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载他的类加载器和这个类本身异同确立其在 ...
深入理解JVM-虚拟机类加载机制
1. 概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
Java类型的加载、连接和初始化过程都是在程序运行期间完成的,为Java应用程序提供高度的灵活性
2. 类加载的时机类从被加载到虚拟机内存中开始,到卸载处内存为止它的整个生命周期包括:
加载(Loading)
验证 (Verification)
准备(Preparation)
解析(Resolution)
初始化(Initialization)
使用(Using)
卸载(Unloading)
验证、解析、准备统称为连接(Linking)
其中,加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的。但是解析不一定,某些情况下可以在初始化之后再开始,这是为了支持Java的运行时绑定。
2.1 加载的时机这个Java虚拟机规范中并没有进行强制约束,这个可以交给虚拟机自订。
2.2 初始化的时机对于初始化的时机,虚拟机规范强制规定只有5中情况必须立即对类进行“初始化”
遇到new、getstatic、putstatic或i ...
Java集合源码之HashMap
简介HashMap是一个哈希表,线程不安全,key唯一,value可重复,允许key和value为null。遍历时是无序的。
底层结构是基于链表散列,也就是数组+链表。数组也被称为哈希桶,桶里面就装着链表,链表中的每个节点,就是哈希表中的每个元素。
在JDK8中,当链表长度达到8的时候,就会转为红黑树。
它实现了Map<K, V>, Cloneable, Serializable接口。
接下来我们就来看下源码:
属性1234567891011121314151617181920212223242526272829303132333435// 序列化ID,用于序列化和反序列化private static final long serialVersionUID = 362498820763181265L;// 默认初始容量也就是16-必须为2的幂。static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16// 最大容量。// 如果两个构造函数都使用参数隐式指定了更高的值,则使用该容量。 // 必须是2的 ...
Java集合源码之ArrayList
简介ArrayList可以说是我们最常用的一种集合了。
他的本质是一个数组,一个可以自动扩容的动态数组,线程不安全,允许元素为null。
由于数组的内存连续,可以根据下标以O(1)的时间读写元素,因此时间效率很高。
内部属性我们先来看下ArrayList里面有哪几个属性:
private static final long serialVersionUID = 8683452581122892189L;序列话UID。由于ArrayList实现了Serializable接口,为了序列化和反序列化的方便,我们就手动为他添加一个序列化UID。
private static final int DEFAULT_CAPACITY = 10;默认的容量。
private static final Object[] EMPTY_ELEMENTDATA = {};空数组。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};默认的空数组。
transient Obje ...
Android消息机制之Handler
简介作为一个Android开发者,Handler的大名你一定听过。做Android开发肯定离不开Handler,它通常被我们用来连通主线程和子线程。
可以说只要有异步的地方一定有Handler。
那么,你了解过为什么Handler能连通主线程和子线程吗,也就是说,你了解过Handler背后的原理吗?
就让本文带你了解。
Handler的基本用法按照惯例,我们首先看下Handler的一般用法:12345678910Handler mHandler = new Handler() { @Override public void handleMessage(final Message msg) { // 在这里接受并处理消息 }};//发送消息mHandler.sendMessage(message);mHandler.post(runnable);
也就是创建一个Handler对象,并重写handlerMessage方法,然后在需要的时候调用sendMessage方法传入一个message对象,或者调用post方法传入 ...