1:不可變化類。java
2:單例類數組
3:枚舉類多線程
4:註解 – 後面有增強ide
5:泛型-後面有增強。spa
String[]數組類的copy與增加.net
1:不可變類。線程
當一個類已經實例化之後,就不再能修改裏面的成員變量的值的類。不可變類。orm
1:對於一個類,成員變量是私有的 。對象
class Person{繼承
private String name;
2: 在構造方法裏,接收成員變量值。
Public Person(String name){
This.name=name;
}
3:且這個類再也沒有給出修改name的方式
getName(){
}
}
2:單例類
3:枚舉類
就是使用enum聲明的類,從單例變化而來的。
1:聲明的成員變量只能是本身。默認的構造是私有的。
2:擁有一些方法:valueOf(…)
3:全部enum都是java.lang.Enum的子類。
public void test1() {
Gender g1 = Gender.MALE;// 從枚舉裏面獲取一個對象
Gender g2 = Gender.MALE;
System.err.println(g1 == g2);// true
System.err.println(g1.equals(g2));// true
// 獲取枚舉裏面的全部對象
Gender[] gs = Gender.values();
for (Gender g : gs) {
System.err.println(g);
}
// 根據一個字符串,建立一個枚舉對象
String str = "male";
Gender g3 = Gender.valueOf(str.toUpperCase());
System.err.println(g3);
// 全部Enum類,都是java.lang.Enum的子類
System.err.println(g3 instanceof Gender);// true
System.err.println(g3 instanceof Enum);// true
// 還能夠經過Enum類
Gender g4 = Enum.valueOf(Gender.class, str.toUpperCase());
System.err.println(g4);
}
}
class Sex {
public static final Sex MALE = new Sex();// 靜態常量
public static final Sex FEMALE = new Sex();
private Sex() {
}
}
enum Gender {
MALE, FEMALE;
private Gender() {
}
}
4:註解 – 後面有增強
在編譯時限制的做用。
1.public class Demo01 {
@Override
public String toString() {
return super.toString();
}
2:在運行時給反射使用 - 後面纔會講到 – Java高級特色。
註解:1:都是經過 @interface 聲明的類。
2:註解在聲明時應該設置所註解的範圍。
3:全部註解,都是java.lang.Annotation的子類。
@Target (value={ElementType.METHOD,ElementType.TYPE})
public @interface MyTest {
}
5:泛型-後面有增強。
String[]數組類的copy與增加
不肯定返回何種類型時,就能夠使用這種類型:
1:聲明在方法上的泛型
public class Demo03 {
@Test
public void test() {
String ss = say("Jack");
int a = say(3);
double d = say(34.9);
}
public <T> T say(T obj) {
T t = null;
System.err.println("hello...");
return obj;
}
}
2:聲明在類上
class One<E> {
public E say(E e) {
System.err.println("Hello..");
return e;
}
}
類的變體:
1:枚舉 enum聲明的類。
2:註解類 – 經過 @interface聲明的類。
---
泛型
方法上 <T>
類上
--某些特另的類:
不可變類。
Java體系的五支柱:
IO/Socket/Thread/JDBC/Coollections
進程
一個程序在擁有一塊鏈接的內存空間。【進程不會執行任何工做】
線程:
線程是一個程序中執行的多個子任務,一個進程中,必需要至少擁有一個線程。
多個線程共享同一個內存空間,但又獨立的執行。
package cn.demo02;
public class Demo04 {
public static void main(String[] args) {
new Thread() {
public void run() {
for (int i = 0; i < 100; i++) {
System.err.println("i is:" + i);
}
};
}.start();
new Thread() {
public void run() {
for (int j = 100; j > 0; j--) {
System.err.println("----------------------j is:" + j);
}
};
}.start();
}
}
在Java裏面java.lang.Thread就是線程的類。
當運行main方法時,JVM就會會當前的Java應用程序,建立一個主線程。
獲取當前線程的引用:
package cn.demo02;
public class Demo05 {
public static void main(String[] args) throws Exception {
Thread th1 = Thread.currentThread();// 獲取當前正在執行的線程或是獲取當前執行main方法的線程
System.err.println("1:name is:" + th1.getName());// 輸 出main
say();
new Demo05().hello();
}
public static void say() {
Thread th1 = Thread.currentThread();
System.err.println("2:---name is:" + th1.getName());// main
}
public void hello() {
Thread th1 = Thread.currentThread();
System.err.println("3:---name is:" + th1.getName());//main
}
}
Step:
1:開發一個類,繼承Thread類。
2:重寫裏面的run方法,將子線程執行的方法都放到run方法裏面。
3:實例化這個類,且調用它的start方法。啓動線程。
package cn.demo02;
public class Demo05 {
public static void main(String[] args) throws Exception {
OneThead one = new OneThead();
one.start();
}
public static void say() {
Thread th1 = Thread.currentThread();
System.err.println("2:---name is:" + th1.getName());// Thread-0
}
public void hello() {
Thread th1 = Thread.currentThread();
System.err.println("3:---name is:" + th1.getName());// Thread-0
}
// 1:
static class OneThead extends Thread {
// 2:重寫run
@Override
public void run() {
Thread th1 = Thread.currentThread();
System.err.println("<><><><><><>name is:" + th1.getName());// 子線程的取名的方式Thead-0
say();
new Demo05().hello();
}
}
}
1:新建立的 Thead t = new OneThead();
2:就緒狀態 – t.start(); - > 準備搶cpu的使用權。
3:運行狀態 – 正在執行run方法的線程。
4:阻塞狀態 – 執行線程休眠或是在線程裏面等待用戶的輸入。
5:死亡狀態- - 運行完成了run方法。
package cn.demo02;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo06 {
public static void main(String[] args) {
Thread t = new Thread() {
@Override
public void run() {
// 1:聲明一個時間的格式化類 2009-12-09 12:345:56
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while (true) {
String str = sdf.format(new Date());
System.err.println(str);
//執行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
System.err.println("啓動完成");
}
}
兩種:
1:繼承 Thread類,重寫run方法。
(略)
2:實現一個接口: java.lang.Runnable接口。
package cn.demo02;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo07 {
public static void main(String[] args) {
// 3:建立一個線程類
Thread t = new Thread(new OneThread());
// 4:依然是啓動t
t.start();
System.err.println("Started...");
}
}
// 1:開發一個類,實現接口
class OneThread implements Runnable {
// 2:必需要實現run方法
@Override
public void run() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
while (true) {
System.err.println(sdf.format(new Date()));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Class Thread implements Runable{
/* What will be run. */
private Runnable target;
@Override
public void run() {
if (target != null) {
target.run();
}
}
}
public class Demo08 {
public static void main(String[] args) {
Runnable run = new Runnable() {
@Override
public void run() {
System.err.println("World....");
}
};
Thread t = new Thread(run) {
@Override
public void run() {
System.err.println("Hello...");
super.run();
}
};
t.start();
}
}