有術無道止於術,有道無術術尚可求java
- Shutout to 馬士兵、李衛民
- 向全部開發者致敬
Think in Java
總和C++
進行比較.class
->解釋public class HelloWorld{
public static void main(String[] args){
System.out.println("hello world");
}
}
複製代碼
Java類名和文件名應該同樣,類體和方法體,一個源文件只能有一個public class
一個.java
文件中有兩個類的話 會編譯出來兩個.class
文件 Java 嚴格區分大小寫算法
註釋對於編譯器視而不見 //TODO編程
有特殊顏色的就是關鍵字 都是小寫 goto const
java沒有用可是也是關鍵字bash
'A'
String name = "你的名字"
(字符串這不少東西)double d1,d2,d3 = 0.123
聲明瞭三個變量 思考這三個變量的值都是多少(不是都是0.123)main(String[] args)
按聲明的位置分爲局部變量和成員變量eclipse
按所屬的類型分爲基本數據類型變量和引用數據類型變量編程語言
在大括號裏聲明的變量,出了大括號就沒有人認識了編輯器
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 b = true;
if(b){
// TODO
}
複製代碼
char eChar = '中'
char c1 = '\u0061;
複製代碼
utf8 utf16
java用的是utf16 都佔用兩個字節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進制比較重要佈局
long l1 = 888888888888L
float f = 12.3f
不寫f會處理成double 裝不進floatfloat 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;//報錯
複製代碼
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
}
}
複製代碼
public class TestBreak{
public static void main(String[] args){
for(int i = 0; i < 10 ; i++){
if(1 == 1);
break;
System.out.println(i); // 報錯 沒法訪問的語句
}
}
}
複製代碼
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()
這裏面只能是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 3:
case 4:
case 5:
System.out.println("等於3 4 5");
break;
複製代碼
英雄無敵
掄大棒子的兄弟 程序的健壯性很重要!void echo(){
// 二話不說就返回
return;
System.out.println("echo");
}
複製代碼
在方法內部對自身進行調用
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
就是調構造方法
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;
}
}
複製代碼
名字相同,參數不同
// 是否構成重載?
void max(int a, int b){
return a > b ? a : b;
}
void max(short a, short b){
return a > b ? a : b;
}
複製代碼
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");
}
}
複製代碼
this通常出如今方法中
data seg
.
訪問的必定是靜態成員變量。System.out
public class Cat{
public static int count;
Cat(){
//TODO
count ++;
}
}
複製代碼
data seg
,代碼在代碼區。接口中的方法是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("國家幹部和寵物玩");
}
}
複製代碼
面向對象極爲重要,呵呵,就是很重要