java超神之路
JAVA三大版本的介紹
- java se 標準版用於個人的計算機
- java ee 企業版,在服務端應用。
- JAVA me 微型版,定位在消費性電子產品的應用上。一定要和安卓開發區分開
java的特性以及專有名詞介紹
Java特性
- 跨平臺可移植性
- 安全性
- 面向對象
- 簡單性
- 高性能
- 分佈式
- 多線程
- 健壯性
java概念
包
起作用是把比較接近的類放在同一個包下,對於每一個類來說,我們必須在代碼開始的地方首先說明該類所在的包名,組織形式如果爲package1/package2 則包名爲package1.package2
使用其他包下的類,我們需要import這個包名(jar包原理相同)
分類:
自身:指的是Hero自己
同包子類:ADHero這個類是Hero的子類,並且和Hero處於同一個包下
不同包子類:Support這個類是Hero的子類,但是在另一個包下
同包類: GiantDragon 這個類和Hero是同一個包,但是彼此沒有繼承關係
其他類:Item這個類,在不同包,也沒有繼承關係的類
訪問修飾符
關鍵字static & final
final 修飾一個變量,有很多種說法,比如不能改變等等
準確的描述是 當一個變量被final修飾的時候,該變量只有一次賦值的機會
final 除了修飾變量,還可以修飾類,修飾方法,這些都在後續的章節展開
如果final修飾的是參數,能否在方法裏給這個參數賦值?
不能 多次調用,肯定會多次賦值,不符合final的設計理念
當一個屬性被static修飾的時候,就叫做類屬性,又叫做靜態屬性
當一個屬性被聲明成類屬性,那麼所有的對象,都共享一個值
與對象屬性對比:
不同對象的 對象屬性 的值都可能不一樣。
比如蓋倫的hp 和 提莫的hp 是不一樣的。
但是所有對象的類屬性的值,都是一樣的
類屬性&訪問類屬性
類屬性: 又叫做靜態屬性
對象屬性: 又叫實例屬性,非靜態屬性
如果一個屬性聲明成類屬性,那麼所有的對象,都共享這麼一個值
static String copyright;
訪問類屬性的方法
text.printHello()
text t = new text;
t.printHello();
訪問一個對象方法,必須建立在有一個對象的前提的基礎上
訪問類方法,不需要對象的存在,直接就訪問
初始化
- 對象屬性的初始化方式有三種
聲明的時候直接初始化
初始塊初始化
構造器初始化
class text{
String name = "string";
int temp;
{
temp=3;
}
public Hero(){
temp =3;
}
}
- 類屬性的初始化方法
1、聲明該屬性的時候初始化
2、靜態初始化塊
class text{
static int temp=3;
static int flag;
static{
flag=3;
}
}
Java基礎
基本類型
如果任何運算單元的長度都不超過int,那麼運算結果就按照int來計算
如果有任何運算單元的長度超過int,那麼運算結果就按照最長的長度計算
比如
int a = 5;
long b = 6;
a+b -> 結果類型是long
如果任何運算單元的長度都不超過int,那麼運算結果就按照int來計算
byte a = 1;
byte b= 2;
a+b -> int 類型
變量
字段,屬性,Field
如果一個變量,是聲明在一個方法上的,就叫做參數
參數的作用域即爲該方法內的所有代碼
其他方法不能訪問該參數
類裏面也不能訪問該參數
操作符
算數操作符
‘+ - * / % ++ --’
關係操作符:比較兩個變量之間的關係
> 大於
>= 大於或等於
< 小於
<= 小於或等於
== 是否相等
!= 是否不等
位操作符
public class HelloWorld {
public static void main(String[] args) {
int i = 5;
String b = (Integer.toBinaryString(i)); // 5的二進制的表達101
System.out.println(i+" 的二進制表達是: "+b);
}
}
三元操作符
?:
int k = i < j ? 99 : 88;
枚舉
枚舉類型主要用法是和switch相結合使用,枚舉的基本使用方法如下所示
enum Season{
SPRING,SUMMER,AUTUMN,WINTER
}
Season season = Season.SPRING;
switch(season){
case SPRING:
System.out.println("春天");
·
·
·
}
- 使用枚舉的好處
假設在使用switch的時候,不是使用枚舉,而是使用int,而int的取值範圍就不只是1-4,有可能取一個超出1-4之間的值,這樣判斷結果就似是而非了。(因爲只有4個季節) - 遍歷枚舉
藉助增強型for循環,可以很方便的遍歷一個枚舉都有哪些常量
for(Season s:Season.values()){
System.out.println(s);
}
Scanner 獲取鍵盤輸入
import java.util.Scanner;
需要注意的是,如果在通過nextInt()讀取了整數後,再接着讀取字符串,讀出來的是回車換行:"\r\n",因爲nextInt僅僅讀取數字信息,而不會讀取回車換行"\r\n".
所以,如果在業務上需要讀取了整數後,接着讀取字符串,那麼就應該連續執行兩次nextLine(),第一次是取走回車換行,第二次纔是讀取真正的字符串
Scanner in = new Scanner(System.in);
System.out.println("請輸入名字");
String name = in.nextLine();
System.out.println(name);
System.out.println("請輸入年齡");
int age = in.nextInt();
System.out.println("已經來的時間"+365*age);
數組
聲明過程
int[] a; 聲明瞭一個數組變量。
[]表示該變量是一個數組
int 表示數組裏的每一個元素都是一個整數
a 是變量名
但是,僅僅是這一句聲明,不會創建數組
創建數組的時候,要指明數組的長度。
new int[5]
引用概念:
如果變量代表一個數組,比如a,我們把a叫做引用
與基本類型不同
int c = 5; 這叫給c賦值爲5
聲明一個引用 int[] a;
a = new int[5];
讓a這個引用,指向數組
初始化
int []a=new int [5]
int[] a= new int[]{1,2,3,4}
注:增強型for循環只能用來取值,卻不能用來修改數組裏的值
數組的常用方法和屬性
-
獲取數組長度
數組的一般成員屬性length 注意非方法
a.length -
數組複製
arraycopy函數 屬於系統方法
把一個數組的值,複製到另一個數組中
System.arraycopy(src, srcPos, dest, destPos, length)
src: 源數組
srcPos: 從源數組複製數據的起始位置
dest: 目標數組
destPos: 複製到目標數組的起始位置
length: 複製的長度 -
copyOfRange:
int[]b= Arrays.copyOfRange(a,0,3);
參數代表起始的位置,需要注意的是範圍爲【0,3)函數返回類型爲arrays -
排序
sort函數
排序方法Arrays.sort(a)最後的結果是升序排序
最後的結果會對a數組本身產生影響 -
查找
Arrays.binarySearch(a,ele);
在使用binarySearch進行查找時,應首先進行過Arrays.sort(a) -
相等
equals()
a.equals()
==
區分python中的is中
二維數組
int[][] b = new int[2][]; //有兩個一維數組,每個一維數組的長度暫未分配
面向對象
面向對象的關鍵是在宏觀中進行把握,在宏觀上進行調控。相當於是組織的作用
對象引用與指向
每次new 都會創建新的對象
A h=new A()
h稱作對A對象的引用
而引用的過程稱作指向過程
當一個引用指向另一個對象時,如果源對象沒有其他引用指向的話,則會被jvm回收
也就是說只有當new時纔會產生新的對象
繼承
- 關鍵字extends
當一個類 繼承主類之後可以享有所有非private級別的屬性和方法,一般來說,默認所有的屬性值全部爲private級別,而getter和setter方法爲public級別,方便對輸入輸出值進行控制.
class text extents main_class{
}
值得注意的是所有的子類,默認繼承父類的構造方法,使用方法如下
父類中有的構造器,在子類中通過super()方法進行調用,但是,super()方法一定在其他元素初始化之前進行調用 - 關鍵字this
this關鍵字代表當前對象,可以調用當前類中所有的成員變量
打印this看到的虛擬地址
this同樣能用做在同一個類中,作爲另一個構造其中的部分形參的構造器
class text{
String name;
int price;
public text(String name){
this.name=name;
}
public text(String name ,int price){
this(name);
this.price=price;
}
}
重載
方法名一樣,但是參數不同
如:
func(int a)
func(double a)
傳參
只分爲基本類型傳參和類傳參
對於基本類型傳參來說,我們是沒有辦法對方法外的值做出改變的,因爲我們始終傳入的是副本,對於類來說我們傳入的其引用,此時,如果想要不對原來的值產生影響,需要在類中實現接口Cloneable
class text implements Cloneable{
String name;
int price;
public Object clone(){
return super.clone();
}
}
public static void main(String[]agrs){
text t= new text();
text kk = (text)kk.clone(;
}
接口與繼承
接口就像是一種約定,我們約定某些英雄是物理系英雄,那麼他們就一定能夠進行物理攻擊
實現某個接口,就相當於承諾了某種約定,繼承了某種接口就必須實現接口中的函數,可以同時繼承多個接口
一般來說使用過程如下
//首先定義兩個文件A.class B.class
public class A{
public void Print();
}
public class B implements A{
public void Print(){
System.out.println();
}
}
java虛擬機
JAVA虛擬機的內存可以分爲三個區域:棧、堆和方法區
棧stack
棧描述的是方法執行的內存模型,每個方法被調用都會創建一個棧幀(用於存儲局部變量、操作數、方法出口),JVM爲每一個線程創建一個棧,用於存放相關方法的信息
棧屬於線程私有,不能線程間共享
棧的存儲特性是“先進先出和後進後出”
棧是由系統自動分配,速度快,並且棧是一個來納許的存儲空間
堆heap
堆用於存儲創建好的對象和數組
JVM只有一個堆,被所有的線程共享
堆是一個不連續的內存空間,分配靈活,速度慢
方法區
JVM只是一個方法區,被所有的線程共享
方法區實際也是堆,只是用於存儲類,常量相關的信息
用來存放程序中永遠是不變或者唯一的內容
參數傳遞
JAVA中的所有
值傳遞
在方法被調用時,實參通過形參把它的內容傳輸方法內部,此時形參把他的接收到的內容是實參值的一個拷貝,因此在方法內對形參的任何操作,都僅僅是對這個副本的操作,不影響原始值的內容
JAVA設計模式
單例模式
所謂單例模式,就是對於此類來說,可以,且僅可以有一個實例對象,主要特徵如下:
構造方法私有化
私有靜態屬性指向實例
public static 的 getInstance方法返回第二步的靜態屬性
又主要分爲一下兩類模式
一種是餓漢式單例模式,即對於變量剛開始時候就進行初始化,對於其他所有對象來說,唯一一種創建實例的方法即
text t = text.getInstance();
class text{
private text(){}
private static text Instance = new text();
public static text getInstnce(){
return Instance;
}
}
還有一種是懶漢式單例模式
與上面的區別是,只有當確實調用該方法的時候纔會去創建對象
class text{
private text(){}
private static text Instance;
public static text getInstnce(){
if(Instance==null){
Instance = new text();
}
return Instance;
}
}
應用
餓漢式立即加載,無論是否會用到這個對象,都會加載,如果在構造方法裏寫了性能消耗較大,則不應使用
懶漢式,是延遲加載的方式,只有使用的時候纔會加載。 並且有線程安全的考量(鑑於同學們學習的進度,暫時不對線程的章節做展開)。
使用懶漢式,在啓動的時候,會感覺到比餓漢式略快,因爲並沒有做對象的實例化。 但是在第一次調用的時候,會進行實例化操作,感覺上就略慢。