靜下心來擼一遍Java知識點

有術無道止於術,有道無術術尚可求java

  • Shutout to 馬士兵、李衛民
  • 向全部開發者致敬

第一章 Hello World

  • 第一代編程語言:打孔機,老師都沒有見過
  • 第二代編程語言:彙編,比較難
  • 第三代編程語言:面向過程語言
  • 三代半:面向對象
  • 第四代語言:SQL
  • 第五代:天然語言(退休)
  • Think in Java 總和C++進行比較
  • Java沒有指針可是全是指針
  • JVM和GC
  • Java是先編譯.class->解釋
  • 垃圾收集,只用申請內存就行,有人給回收
  • eclipse是java寫的
  • 面向JVM編程
  • 開發用JDK(包含JRE) 生產用JRE?
  • 讀書不要摳字眼尤爲是計算機書
  • 輸一個命令會去path環境變量中的目錄裏去找,path是從前日後找。配置了環境變量須要重啓一下命令行 java -version 看當前用的那個jdk
  • classpath java在編譯和運行的時候找的class文件(我沒有配過classpath)
public class HelloWorld{
    public static void main(String[] args){
        System.out.println("hello world");
    }
}
複製代碼

Java類名和文件名應該同樣,類體和方法體,一個源文件只能有一個public class 一個.java文件中有兩個類的話 會編譯出來兩個.class文件 Java 嚴格區分大小寫算法

Java註釋

註釋對於編譯器視而不見 //TODO編程

總結第一個程序

  • path & classpath
  • 熟悉常見的錯誤
  • 熟悉Java程序簡單的規則
  • 熟悉Java程序的編譯和運行

編輯器和IDE

  • 編輯器:Nodepad++,視頻中那個年代用ultra edit
  • IDE:集成開發程序,編寫,編譯,調試,運行。
  • 開始學的使用用編輯器
  • 10天以後用IDE

第二章 基礎語法

標識符

  • 標識符就是能本身起名的 字母數字下劃線
  • 不能用數字開頭
  • 大小寫敏感 不能與關鍵字重名
  • 用正常人的思惟起名就好了——見名知意

關鍵字

有特殊顏色的就是關鍵字 都是小寫 goto constjava沒有用可是也是關鍵字bash

java 常量

  • 字符串常量
  • 整數常量
  • 字符常量(在計算機裏是數字)'A'
  • 不可變的變量
  • final

變量

  • 先聲明再賦值,使用變量名來用它
  • 本質上變量是內存中的一小塊區域
  • 變量的名字 String name = "你的名字"(字符串這不少東西)
  • 變量有數據類型 根據數據類型在內存中佔的大小 double d1,d2,d3 = 0.123聲明瞭三個變量 思考這三個變量的值都是多少(不是都是0.123)
  • 全局變量會初始化一個值,局部變量必須給有初始值

內存分析(編譯原理)

內存分析

  • 把代碼全load到內存裏去
  • 找到main方法進行執行 main(String[] args)
  • 開始內存的管理
  • code segment(load進來)
  • data segment 靜態變量和字符串常量
  • heap(全部new出來的東西)
  • stack(局部變量)

變量的分類

按聲明的位置分爲局部變量和成員變量eclipse

  • 局部變量:方法或者語句塊裏定義的變量 方法的參數也是(形參)
  • 成員變量:方法外部類內部定義的變量

按所屬的類型分爲基本數據類型變量和引用數據類型變量編程語言

  • 類外面不能有變量的聲明
  • Java裏的全局?(有嗎) Java是純的面向對象的,上來就是一個class 因此沒有全局變量的概念,全局參考下C++全局是什麼

變量的做用域

在大括號裏聲明的變量,出了大括號就沒有人認識了編輯器

public class TestVar{
    // 靜態變量和靜態方法等 知識點(static)
    static int j;
    public void m(){
        int i = 0;
        System.out.println(i);
    }
    public static void main(String[] args){
        int i = 0;
        System.out.println(i);
        System.out.println(j);
        boolean b = false;
        if(b){
            int c = 0;
            System.out.println("b is true");
        }
        // 這裏報錯找不到變量c
        System.out.println(c);
        long longNum1 = 8888888888888888;
    }
}
複製代碼

type writer && programmer 多寫函數

數據類型

數據類型

  • 四類八種
  • 內存中的大小和小格的佈局

Boolean

  • 這和C語言不同 只有true或false,不能用0或非0代替
boolean b = true;
if(b){
    // TODO
}
複製代碼

字符型char

  • char表示一般意義上的字符 char eChar = '中'
  • Java採用 Unicode編碼(全球語言統一編碼) 每一個字符佔兩個字節 於是能夠用十六進制編碼表示例如:
char c1 = '\u0061;
複製代碼
  • 全部的文字在計算機都是0101,每個0或1 是一個bit 8bit是一個字節
  • 一個字節是8位 能表示2^8 也就是256種字
  • 涉及到編碼的知識延伸,Unicode能表示全世界的語言
  • utf8 utf16java用的是utf16 都佔用兩個字節
  • 又扯到了進制相關的知識
  • 轉義\n表示換行符

整數類型(在全部操做系統佔用的大小同樣)

C 有unsigned類型的整數 有一個字節用來表示正負號oop

類型 佔用空間(字節) 表示數的範圍
byte 1 -128~127
short 2 -2^15~2^15-1
int 4 -2^31~2^31-1
long 8 -2^63~2^63-1

16進制和10進制比較重要佈局

  • 後面不寫L 會當成int來處理 可是裝不下long l1 = 888888888888L

浮點類型

  • 默認是double類型
  • float f = 12.3f 不寫f會處理成double 裝不進float
  • float 4個字節(7位) double 8個字節(15位) 有偏差的 比較浮點數 知識點
  • 那個年代還有瑞星

基礎數據類型轉換

  • Boolean類型不能轉換成其餘數據類型
  • 字符型能夠和數值型進行運算 由於他就是一個數字
  • byte short char 不會相互轉換 他們作運算首先轉成int類型
  • int->byte 4個字節變成1個字節 砍掉三個字節
  • long->int 也是砍
  • double->float infinity 不能砍 由於中間有小數點
  • 浮點數轉換成整數會砍掉小數點後面的 不是四捨五入
float f1 = 0.123;// 報錯 不兼容的類型
long l1 = 888888888888888888;// 過大的整數
float f2 = 123;//沒毛病
float f3 = f1 + f2*0.3;//報錯 0.3是double
複製代碼
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2;//錯誤: 不兼容的類型: 從int轉換到byte可能會有損失
複製代碼
byte b1 = 68;
byte b2 = 86;
byte b3 = (byte)(b1 + b2);//-102
複製代碼
int i=1,j;
j = j + 10;// 聲明瞭沒有賦值
i = i / 10;// 兩個都是int 操做完了仍是int result=0
i = i * 0.1;// 報錯 結果是double 須要強轉

char c1='a',c2=125;
char c = c1 - c2;// 結果是int 仍是報錯
複製代碼

大數轉換成小數寫上強制轉換,坑仍是挺多的

float f = (float)0.123;// 0.123f 這兩種寫法本質上區別很大
byte b = 128;//報錯
複製代碼

數據類型轉換

格式——比算法還重要

  • 語句塊之間加空行
  • 並排語句加空格 好比for
  • 運算符兩側加空格

運算符

  • 自增運算符
  • System.out.pirnt()不換行打印
  • 邏輯運算符 短路與 短路或 異或。。。
  • |||短路或
  • +字符串鏈接,把其餘值轉換成了字符串類型
  • 當打印時 都轉換成字符串

三目運算符

int x = -100;
int flag = x > 0 ? 1 : (x == 0 ? 0 : -1)
複製代碼

語句

條件語句和循環語句

  • 循環語句java中有三種 for while do while 循環的執行某一段話

  • if語句 只有一行的時候能夠省略大括號 當心

  • 設計一個算法很難,多學習別人的算法

  • 分析別人的算法時 分析內存 每個值得變換 找找規律

    分析循環

  • 計算1!+2!+3!……+10!

  • 計算1+3+5+7+……+99

public class OddSum{
	public static void main(String[] args){
		// 計算100之內奇數的和
		int result = 0;
		for (int i = 1; i <= 100; i+=2){
			result += i % 2 != 0 ? i : 0;
		}
		
		System.out.println(result);// 2500
	}
}
複製代碼
  • for循環裏第一個語句只執行一次
  • do while不多用
public class TestBreak{
	public static void main(String[] args){
		for(int i = 0; i < 10 ; i++){
			if(1 == 1);	
			break;
			System.out.println(i); // 報錯 沒法訪問的語句
		}
	}
}
複製代碼
  • continue終止本次循環,進行下次
  • 輸出1~100前五個能夠被3整除的數
  • 輸出101~200內的質數
public class TestLoop{
	public static void main(String[] args){
		TestLoop tl = new TestLoop();
		tl.foo();
		tl.bar();
	}
	
	// 計算被3整除的前五個數 在100之內
	public void foo(){
		// 計數器
		int num = 0;
		for(int i = 1; i <= 100; i++){
			if(i % 3 == 0){
				System.out.print(i + " ");
				num ++;
			}
			if(num == 5) break;
		}
	}
	
	// 輸出101~200之間的質數
	public void bar(){
		System.out.println();
		for(int i = 2; i < 200; i++){
		    boolean isZS = true;
			for(int j = 2; j < i; j++){
				if(i % j == 0){
					isZS = false;
					break;
				}
			}
			if(isZS){
				System.out.println(i);
			}
		}
	}
}
複製代碼
  • switch case 當心case穿透問題
  • switch() 這裏面只能是int 在java中 只要能轉換成int的就能傳進去
public class TestSwitch{
  public static void main(String[] args){
    long s = 2^10L;
    switch(s){
      case 100:
        System.out.println(s);
        break;
      default:
        System.out.println("bababalalalal");
        break;
    }
  }
}
複製代碼
  • 多個case能夠合併 同時知足
case 3:
case 4:
case 5:
  System.out.println("等於3 4 5");
  break;
複製代碼
  • default能夠不寫 可是推薦寫,印度人牛逼是由於母語 和 成語寫的傻壯傻壯的
  • 程序魯棒性 英雄無敵掄大棒子的兄弟 程序的健壯性很重要!
  • 12點該睡覺

方法

C/C++叫函數 Java叫方法 完成特定功能的代碼片斷 加強函數的複用性

  • void 調用 不返回任何值
  • 關鍵字 return
void echo(){
  // 二話不說就返回
  return;
  System.out.println("echo");
}
複製代碼

遞歸 在紙上畫 著名的漢諾塔問題

在方法內部對自身進行調用

  • fibonacci
public class TestFibonacci{
  public static void main(String[] args){
    // 非遞歸的方式實現fibonacci
    fib(-1);
  }
  
  public static void fib(int index){
    // 健壯性 參數校驗
    if(index < 1){
      System.out.println("非法的參數index");
      return;
    }
    
    long a = 1L;
    long b = 1L;
    long c = 0L;
    
    for(int i = 1; i <= index; i++){
      if (i == 1 || i == 2){
        System.out.println("第"+i+"個:"+1);
      }else{
        c = a + b;
        a = b;
        b = c;
        System.out.println("第"+i+"個:"+c);
      }
    }
  }
}
複製代碼

第三章面向對象編程

面向對象

  • 面向對象是重點,理解很差寫的實際上是面向過程
  • 面向對象和麪向過程說白了就是代碼複用的程度不一樣
  • 類是同一類對象的抽象 類中有屬性和方法。
  • 全部的變量須要先聲明,成員變量有初始化值,局部變量沒有,必須手動初始化。這也就是成員變量和局部變量重要區別。

引用是什麼,一小塊內存指向一大塊內存

除了基本數據類型(4類8種)都是引用類型

  • 基本類型就佔一塊內存
  • 引用類型佔兩塊內存,對象在堆裏面,引用在棧裏。堆是動態分配內存的,運行期間分配,堆裏空間比較大。著名的垃圾回收器回頭給收拾了。
  • 類是靜態的概念,在代碼區裏。
  • 方法是隻有一份的,調用才佔用內存。

對象的建立和使用

  • 必須用new關鍵字來建立
  • 使用對象的引用來使用成員變量和方法。
  • 每個對象都有獨立的空間,裏面放的是成員變量。
  • 方法只有一份,全部對象共享,方法就是靜態的代碼,執行的時候才分配空間。

構造方法

構造方法沒有返回值並且方法名和類名同樣new就是調構造方法

  • 方法的參數也是局部變量分佈在stack中,當方法調用完畢以後,這些變量就消失再也不佔用stack的空間
  • 默認的構造方法是一個孔方法,會初始成員變量的值。
  • 分析下列代碼在內存中的過程
public class TestObject{
  public static void main(String[] args){
    TestObject to = new TestObject();
    BirthDay bd = new BirthDay(1);
    System.out.println(bd+"---"+bd.getId());
    
    to.change1(bd);
    System.out.println(bd+"---"+bd.getId());
  } 
  
  void change1(BirthDay bd){
    /*這裏的bd是一個形參,也是在stack中,形參bd的內容就是一個地址*/
    System.out.println(bd+"---"+bd.getId());
    /*形參bd的內容變成了一個新的地址,可是和以前實參沒有一毛錢關係*/
    bd = new BirthDay(10);
    System.out.println(bd+"---"+bd.getId());    
    // 方法執行完畢以後,這個形參bd在stack中會消失,引用的對象也就被回收了。
  }
}

class BirthDay{
  private int id;
  BirthDay(int id){
    this.id = id;
  }
  public int getId(){
    return id;
  }
}
複製代碼

方法的重載-OverLoad

名字相同,參數不同

  • 參數不同指參數個數不同或者參數類型不同
  • 只有返回值類型不同不是重載 是重名,編譯不經過!
// 是否構成重載?
void max(int a, int b){
    return a > b ? a : b;
}
void max(short a, short b){
    return a > b ? a : b;
}
複製代碼
  • 構造方法也是能夠重載的,並且能夠調用
  • 調用直接用this(),如下是錯誤的示範編譯不經過。
public class TestPerson{
  private int age;
  private String name;
 
  TestPerson(){}
  
  TestPerson(int age, String name){
    this.age = age;
    this.name = name;
  }
  
  TestPerson(String name){
    this.TestPerson(name, 18);
  }
  
  public static void main(String[] args){
    new TestPerson("zhangsan");
  }
}
複製代碼
  • stack是從下面開始畫
  • 方法的返回值會臨時存在stack中

this關鍵字

this通常出如今方法中

  • this能夠當作一個變量,值是對當前對象的引用

static關鍵字data seg

  • static成員變量是靜態成員變量,爲該類的公用變量,只有一份。任何對象都能訪問,即便沒有建立對象,用類名也能訪問。
  • 用類名加.訪問的必定是靜態成員變量。System.out
  • 字符串常亮也在data seg

靜態成員變量的做用

  • 計數用
public class Cat{
    public static int count;
    Cat(){
        //TODO
        count ++;
    }
}
複製代碼
  • 基本數據類型沒有指針,Java也不要說指針,Java是引用
  • 分析內存,全部的語言都同樣,局部變量在stack中,對象在heap中,靜態的在data seg,代碼在代碼區。
  • main方法是靜態的,編譯器不用new對象就能調用。

做業

接口中的方法是public的,能夠不寫,可是實現類中重寫方法時不能省略訪問修飾符,省略了的話就成了default,編譯報錯

public class TestInterface{
  public static void main(String[] args){
    withPet(new Worker());
    System.out.println("=================");
    withPet(new Farmer());
    System.out.println("=================");
    withPet(new Gover());
  }
  
  public static void withPet(LookAfterPet lap){
    lap.eat();
    lap.play();
  }
}

interface LookAfterPet{
  void eat();
  void play();
}

class Worker implements LookAfterPet{
  public void eat(){
    System.out.println("工人喂寵物磚頭");
  }
  
  public void play(){
    System.out.println("工人和寵物玩");
  }
}

class Farmer implements LookAfterPet{
  public void eat(){
    System.out.println("農民喂寵物糧食");
  }
  
  public void play(){
    System.out.println("農民和寵物玩");
  }
}

class Gover implements LookAfterPet{
  public void eat(){
    System.out.println("國家幹部喂寵物money");
  }
  
  public void play(){
    System.out.println("國家幹部和寵物玩");
  }
}
複製代碼

2019 v1馬士兵 面向對象

面向對象極爲重要,呵呵,就是很重要

相關文章
相關標籤/搜索