.java
文件 -> 编译 -> .class
字节码文件 -> 放到jvm虚拟机里解释执行)把一个对象私有化,同时提供一些能够被外界访问的属性的方法。java
程序中定义的引用变量所指向的具体类型和经过该引用变量出发的方法调用在编程时并不肯定,而是在程序运行期间才肯定,即一个引用变量到底会指向哪一个类的实例对象。该引用变量发出的方法调用究竟是哪一个类中实现的方法,必须在由程序运行期间才能决定。编程
在java中有两种形式能够实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。安全
static
、final
变量,不能有其余变量,而抽象类中则不必定。extends
关键字扩展多个接口。public
,抽象方法能够有public
、protected
和default
这些修饰符(抽象方法就是为了被重写因此不能使用private关键字修饰)。注:在jdk8中,接口也能够定义静态方法,能够直接用接口名调用,实现类和实现是不能够调用的。若是同时出现两个接口,接口中定义了同样的默认方法,则必须重写,否则会报错。网络
public
、private
、static
等修饰符所修饰,而局部变量不能被访问控制修饰符及static
所修饰;可是,成员变量和局部变量都能被final所修饰。static
修饰的,那么这个成员变量是属于类的,若是没有使用static
修饰,这个成员变量是属于实例的。而对象存在与对内存,局部变量则存在于栈内存。final
修饰的成员变量必须显式地赋值),而局部变量则不会自动赋值。hashCode()
的做用是获取哈希码,也成为散列码,它其实是一个int
整数。这个哈希码的做用是肯定该对象在哈希表中的索引位置。hashCode()
定义在JDK的Object
对象中,这就意味着java中全部类的对象都包含该函数。多线程
散列表存储的键值对(key-value),特色是:能根据“key”快速检索出对应的“value”。这其中就利用到了散列码。并发
当你把对象加入HashSet
时,HashSet
会先计算对象的hashcode
值来判断对象加入的位置,同时也会与其余已经加入的对象的hashcode
值做比较,若是没有相符的hashcode
,HashSet
会假设对象没有重复出现。可是若是发现有相同hashcode
值的对象,这时会调用equals()
方法来检查hashcode
相等的对象是否真的相同。若是二者相同,HashSet
就不会让其加入操做成功。若是不一样的话,就会从新散列到其余位置。这样咱们就大大减小了equals
的次数,相应就大大提升了执行速度。框架
经过咱们能够看出:hashCode()
的做用就是获取哈希码,也称为散列码;它其实是返回一个int整数。这个哈希码的做用是肯定该对象在哈希表中的索引位置。hashCode()
在散列表中才有用,在其它状况下没用。在散列表中hashCode()
的做用是获取对象的散列码,进而肯定该对象在散列表中的位置。异步
hashCode
必定也是相同的equals
方法都返回true
hashCode
值,它们也不必定是相等的hashCode()
的默认行为是对堆上的对象产生独特值。若是没有重写 hashCode()
,则该类的两个对象不管如何都不会相等(即便这两个对象指向相同的数据)状态名称 | 说明 |
---|---|
NEW | 初始状态,线程被构建,可是尚未调用start()方法 |
RUNNABLE | 运行状态,Java县城将操做系统中的就绪和运行两种状态笼统地称做“运行中” |
BLOCKED | 阻塞状态,表示线程阻塞于锁 |
WAITING | 等待状态,表示线程进入等待状态,进入该状态表示但钱县城须要等待其余线程作出一些特定动做(通知或中断) |
TIME_WAITING | 超时等待状态,该状态不一样于WAITING,它是能够在指定的时间自行返回 |
TERMINATED | 终止状态,表示当前县城已经执行完毕 |
在 Java 中,全部的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,两者都是 Java 异常处理的重要子类,各自都包含大量子类。jvm
Error(错误):是程序没法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操做无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 再也不有继续执行操做所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)通常会选择线程终止。函数
这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,由于它们在应用程序的控制和处理能力之 外,并且绝大多数是程序运行时不容许出现的情况。对于设计合理的应用程序来讲,即便确实发生了错误,本质上也不该该试图去处理它所引发的异常情况。在 Java中,错误经过Error的子类描述。
Exception(异常):是程序自己能够处理的异常。Exception 类有一个重要的子类RuntimeException。RuntimeException 异常由Java虚拟机抛出。NullPointerException(要访问的变量没有引用任何对象时,抛出该异常)、ArithmeticException(算术运算异常,一个整数除以0时,抛出该异常)和 ArrayIndexOutOfBoundsException(下标越界异常)。
注意:异常和错误的区别:异常能被程序自己能够处理,错误是没法处理。
在一下4种特殊状况下,finally 块不会被执行
System.exit(int)
已退出程序。exit
是带参函数;若该语句在异常语句以后,finally 会执行关于返回值
若是try 语句里有return,返回的是try 语句块中变量值。详细执行过程以下:
Java IO流共涉及40多个类,这些类看上去很杂乱,但实际上颇有规则,并且彼此之间存在很是紧密的联系,Java IO流的40多个类都是从以下4个抽象类基类中派生出来的。
按操做方式分类结构图:
按操做对象分类结构图:
Socket
和 ServerSocket
相对应的 SocketChannel
和 ServerSocketChannel
两种不一样的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持同样,比较简单,可是性能和可靠性都很差;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可使用同步阻塞I/O来提高开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发