JAVA筆記01

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;
	}
}

應用

餓漢式立即加載,無論是否會用到這個對象,都會加載,如果在構造方法裏寫了性能消耗較大,則不應使用
懶漢式,是延遲加載的方式,只有使用的時候纔會加載。 並且有線程安全的考量(鑑於同學們學習的進度,暫時不對線程的章節做展開)。
使用懶漢式,在啓動的時候,會感覺到比餓漢式略快,因爲並沒有做對象的實例化。 但是在第一次調用的時候,會進行實例化操作,感覺上就略慢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章