Java中的注解Annotation
基本Annotation
@Override
@Deprecated
@SuppressWarnings
@SafeVarargs
@Override用来指定方法重载,它可以强制一个子类必须覆盖父类的方法。
主要是帮助我们避免一些低级错误,例如:父类中有个run()方法,子类中的方法名不小心写成了runn(),在程序编译时候会报错提示。
只能作用于方法,不能作用于其他程序元素。
@Deprecated用于表示某个元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器将会给出警告。
虽然出现警告,但不影响使用,使用还是可以使用的
123456789101112131415//父类,其中标记为test()方法是过时方法。public class SupperClass { @Deprecated public void test(){ System.out.println("我是父类过时方法test"); }}//子类调用是,编译会警告提示,方法已经过时。public cl ...
Java中的线程生命周期
线程的生命周期
新建(New)
就绪(Runnable)
运行(Running)
阻塞(Blocked)
死亡(Dead)
新建和就绪状态新建
当程序使用new关键字创建了一个线程后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值。此时的线程对象没有表现出任何线程的动态特征,程序不会执行线程的线程执行体。
就绪
当线程对象调用了start()方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行。至于该线程何时开始运行,取决于JVM里线程调度器的调度。
特别注意
启动线程使用start()方法,而不是run()方法。永远不要调用线程对象的run()方法。
调用start()方法来启动线程,系统会把run()方法当成线程执行体来处理。
但如果直接调用线程对象的run()方法,则run()方法立即就会被执行,而是在run()方法返回之前其他线程无法并发执行。也就是说,系统把线程对象当成一个普通对象,而run()方法也是一个普通方法,而不 ...
Java中的线程创建和启动
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或者其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码)。Java使用线程执行体来代表这段程序流。
继承Thread类创建线程类通过继承Thread类来创建并启动多线程的步骤如下:
定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。因此把run()方法称为线程执行体。
创建Thread子类的实例,即创建了线程对象。
调用线程对象的start()方法来启动该线程。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970public class MyThread extends Thread { @Override public void run() { for (in ...
Java中的程序、进程、线程
程序、进程、线程的关系
程序:操作系统中通常都支持同时运行多个任务,一个任务就是一个程序。程序只是一个静态的指令集合。
进程:每个运行中的程序,就是一个进程。进程是一个正在系统中活动的指令集合。
线程:当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。
并行性和并发性
并行性:指在同一时刻,有多条指令在多个处理器上同时执行。
并发性:指在同一时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。
Java中的IO流
Java中的IO流分类
输入IO流
输入字节流(InputStream)
处理流
缓冲流(BufferedInputStream)
转换流
数据流(DataInputStream)
标准流(System.in(InputStream))
输入字符流(Reader)
处理流
缓冲流(BufferedReader)
转换流(InputStreamReader)
数据流
标准流
UML关系图如下所示PantUML语法12A <|-- B //B继承AC <|... D //D实现了C
12345678910111213141516171819202122232425262728293031323334353637@startumlabstract class InputStream{}class BufferedInputStream{}class FilterInputStream{}class DataInputStream{}interface DataInput ...
Java中Collections和Arrays类
Collections
Collections是个java.util下的专用静态类,它包含有各种有关集合操作的静态方法。提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作.
1234567891011public static void main(String[] args) { List list = new ArrayList(); list.add(17); list.add(11); list.add(65); list.add(36); Collections.sort(list); System.out.println(list);//[11, 17, 36, 65]}
Arrays
Arrays是个java.util下的专用静态类,它包含有各种有关操作数组 ,提供搜索、排序、复制等静态方法。
123456public static void main(String[] args) { int[] array = new int[]{11, 4, 23, 16, ...
Java中的集合
Java集合体系
Set(接口):代表无序、不可重复的集合
List(接口):代表有序、重复的集合
Map(接口):代表具有映射关系的集合
Queue(接口):代表队列集合
集合类和数组区别
数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量)。
集合里只能保存对象(实际上保存的是对象的引用变量,但通常习惯认为集合里保存的是对象)
Java的集合类主要由两个接口派生而出,他们是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
Collection(接口)
Map(接口)
UML关系图如下所示PantUML语法12A <|-- B //B继承AC <|... D //D实现了C
Collection123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888 ...
Java中的访问控制符
Java提供了4种访问控制级别
private
不加任何访问控制符的访问控制级别(default)
protected
public
从上到下,访问控制级别由小到大。
权限介绍
private:当前类访问权限。如果类中的成员(包括属性、方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。
default:包访问权限。如果类中的成员(包括属性、方法和构造器等)或者一个外部类,不用任何访问控制符修饰,我们就称它是包访问权限。default访问控制的成员或外部类可以被相同包下的其他类访问。
protected:子类访问权限。如果类中的成员(包括属性、方法和构造器等)使用protected访问控制符来修饰,则这个成员即可以被同一个包中的其他类访问,也可以被不同包中的子类访问。
public:公共访问权限。这是一个最宽松的访问控制级别。如果类中的成员(包括属性、方法和构造器等)或者一个外部类,使用public访问控制符来修饰,那么这个成员或者外部类就可以被所有类访问,不管访问类和被访问类是否处于同一个包中,不管是否具有父子继承关系。
外部类只能有两种访问控 ...
Java面向对象三大特征
面向对象三大特征
封装
对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过类所提供的方法来实现对内部信息的操作和访问。
继承
是实现软件复用的重要手段,Java的继承具有单继承特点,每个子类只有一个直接父类,使用extends来实现。
实现继承的类被称为:子类,被继承的类被称为:父类或者基类或者超类。
父类与子类的关系是一种一般和特殊的关系。即,父类(一般),子类(特殊)。比如:水果和苹果的关系,苹果继承了水果,苹果是水果的子类,则苹果是一种特殊的水果。
123public class SubClass extends SuperClass{ //类定义部分}
多态
Java引用变量有两个类型,一个是编译时类型,一个是运行时类型。
编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
如果编译时类型与运行时类型不一致,就可能出现所谓的多态。
123456789101112131415161718192021222324252627282930313233343536373839404142434 ...
Java中的数组类型
数组中的元素类型是唯一的,只能存储一种类型,不能存储多种类型数据。数组是一种引用类型。定义数组12type[] arrayName; //推荐使用这种来定义数组type arrayName[];
初始化数组
静态初始化
初始化时,由程序员显示指定每个数组元素的初始值,由系统决定数组的长度。
12345type[] arrayName = new type[] {element1, element2, element3};//比如int[] a = new int[]{5, 6, 7};int[] b = {6, 7, 8};Object[] obj = new String[]{"hello", "world"};
动态初始化
初始化时,程序员只指定数组长度,由系统为数组元素分配初始值。
整数类型(bype、short、int、long),数组元素的初始值为0
浮点类型(float、double),数组元素的初始值为0.0
字符类型(char),数组元素的 ...