Dart Pub 一直卡在resolve dependencies解決辦法(更換pub源)
1.類:模板,⽤來定義⼀類物件的⽅法和屬性,⽐如⼈、學⽣、貓,萬物都是有模板,都是可 以定義為類。 (類名⾸字⺟⼤寫)
class Student{
} class Person{
} class Cat{
}
物件:類的例項化,⽐如 學⽣這個類例項化,就是 XX同學
Student student = new Student(); Cat cat1 = new Cat(); new Persion();
方法:⽅法是語句的集合,在⼀起完成⼀個功能
⽅法包含於類或物件中,即普通⽅法或者類⽅法
修飾符 返回值型別 ⽅法名(引數型別 引數名){ ... ⽅法體 ... return返回值; }
繼承:⼦類繼承⽗類的特徵和⾏為,使得⼦類物件具有⽗類的⽅法和屬性
⽗類也叫基類,具有公共的⽅法和屬性
動物<-貓
動物<-狗
多型
同⼀個⾏為具有多個不同表現形式的能⼒
優點:減少耦合、靈活可拓展
⼀般是繼承類或者重寫⽅法實現
抽象
關鍵詞abstract宣告的類叫作抽象類,abstract宣告的⽅法叫抽象⽅法
⼀個類⾥包含了⼀個或多個抽象⽅法,類就必須指定成抽象類
抽象⽅法屬於⼀種特殊⽅法,只含有⼀個宣告,沒有⽅法體
teacher類
package day3; public class Teacher {private int age; private String name; private int sex; public void tech(){ System.out.println("教學"); } public void sleep(){ System.out.println("睡覺"); } }
school類
package day3; public class School { private String name; private String address;private int age; private Teacher [] teachers; public void addTearcher(){ } public void setTeachers(Teacher[] teachers){ this.teachers = teachers; } public Teacher[] getTeachers() { return teachers; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ if(age>0){ this.age = age; System.out.println("設定完成"); }else{ System.out.println("非法引數"); } } public static void main(String [] args){ System.out.println("主入口"); School school = new School(); school.setAge(1); Teacher teacher1 = new Teacher(); teacher1.tech(); } }
2.建構函式:⼀種特殊的⽅法,建立物件時⽤來初始化物件,每次使⽤new 建立物件的時候,就會使⽤建構函式。與類具有相同的名稱,但是沒有返回值,Java會⾃動為每個類提供⼀個預設建構函式,如果⾃⼰定義了建構函式,就不再使⽤預設建構函式,如果沒有顯示的寫出預設建構函式, 則會消失。
注意點:如果建構函式之間互相調⽤,務必寫在⽅法第⼀⾏
建構函式種類
預設建構函式
public 類名(){ }
⽆參建構函式
public 類名(){ //寫⾃定義的語句 }
有參建構函式
public 類名(引數型別1 引數名1,引數型別2 引數名2...){ //⾃定義⽅法體 }
建構函式的修飾符
public ⽤的最多,⽤來建立物件
private 私有化建構函式,不給外部建立物件,⽐如⼯具類,或者單例設計模式
default 預設的話,只能在當前包⾥⾯使⽤new 建立物件,⼏乎不⽤
user 類
package day3; //一個類裡面可以有多個建構函式 public class User { private int age; private String name; // 建構函式,相當於這個物件初始化 // 如果建構函式之間互相呼叫,務必寫在方法第一行 public User(){ System.out.println("這是預設建構函式"); this.age = age; } public User(String name, int age){ this.name = name; this.age = age; } public void setAge(int age){ if(age>0){ this.age = age; }else{ System.out.println("非法引數"); } } public int getAge(){ return age; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public void sleep(){ System.out.println("睡覺"); String name = this.getName(); System.out.println(name+"在睡覺"); } public void sleep(String address){ System.out.println(address); System.out.println("睡覺"); } }
maintest類
package day3; public class MainTest { public static void main(String [] args){ // test1(); // test2(); test3(); } public static void test3(){ User user = new User(); } public static void test2(){ String name = "一把手"; int age = 5; User u = new User(name,age); User u2 = new User(); System.out.println(u.getName()); } public static void test1(){ User user = new User(); user.setAge(10); System.out.println(user.getAge()); user.setName("大爺灰"); System.out.println(user.getName()); } }
3.封裝
封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的接⼝即⽅法
在java中通過關鍵字private,protected和public實現封裝。什麼是封裝?封裝把物件的所有組成部分組合在⼀起,封裝定義程式如何引⽤物件的資料,封裝實際上使⽤⽅法將類的資料隱藏起來,控制⽤戶對類的修改和訪問資料的程度。 適當的 封裝可以讓程式碼更容易理解和維護,也加強了程式碼的安全性.
類封裝
⽅法封裝
overload(過載,過載)
在⼀個類⾥⾯,⽅法名字相同,⽽引數不同,和返回型別⽆關
override(重寫,覆蓋)
⼦類對⽗類的允許訪問的⽅法的實現過程進⾏重新編寫, 返回值和形參都不能改變
返回值型別,⽅法名,引數型別以及個數
⼦類能夠根據需要實現⽗類的⽅法
3.this關鍵字
當⼀個物件建立後,JVM會給這個物件分配⼀個引⽤⾃身的指標,這個指標的名字就是 this
只能⽤於⾮靜態⽅法體內,靜態⽅法和程式碼塊不能出現this
this就是指向當前物件本身
使⽤場景:
this(引數型別1 引數名,...) 表示當前類對應的建構函式
⽅法形參和物件的屬性重名,⽤this來區分
public void setAge(int age){ this.age = age; }
4,繼承
⼦類繼承⽗類的特徵和⾏為,使得⼦類物件具有⽗類的⽅法和屬性
⽗類也叫基類,具有公共的⽅法和屬性,⽣活中的例⼦
動物<-貓
動物<-狗
java中的繼承,減少重複程式碼
格式,通過extends關鍵字
class ⽗類名稱{ } class ⼦類名稱 extends ⽗類名稱{ }
特點
⼦類擁有⽗類的⾮private的屬性和⽅法
⼦類可以⽤⾃⼰的⽅式實現⽗類的⽅法 override(重寫,覆蓋)
實現了程式碼的復⽤
重寫從⽗類那⾥繼承來的⽅法的,當調⽤⽅法時候會優先調⽤⼦類的⽅法(預設就近原則)
注意:
不⽀持多繼承,⽀持多重繼承,多重繼承提⾼了耦合性,組合優於繼承
所有的類都是繼承於 java.lang.Object
final關鍵字
修飾的類,則這個類不可以被繼承
修飾⽅法,則這個⽅法不允許被覆蓋(重寫)
living類
package day3; public class Living { public void run(){ System.out.println("運動"); } }
animal類
package day3; public class Animal extends Living{ private String name; private int age; public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } public void sleep(){ System.out.println("閉著眼睛睡覺"); } }
dog類
package day3; public class Dog extends Animal{ public void eat(){ System.out.println("狗吃骨頭"); } @Override public void sleep(){ System.out.println("狗白天不著眼睛睡覺"); } public void test(){ //呼叫父類的方法,super表示父物件的引用 super.sleep(); //呼叫當前類的方法,this表示當前物件的引用 this.sleep(); } }
EetendsMainTest類
package day3; public class EetendsMainTest { public static void main(String [] args){ Dog dog = new Dog(); dog.setAge(1); dog.setName("旺財"); System.out.println(dog.getAge()); dog.sleep(); dog.eat(); dog.test(); } }
5.繼承
⼀個引⽤變數,⽤於引⽤⽗類物件
⽗類和⼦類都具有相同的命名⽅法,要調⽤⽗類⽅法時使⽤
⽗類和⼦類都具有相同的命名屬性,要調⽤⽗類中的屬性時使⽤
super也是⽗類的建構函式,格式 super(引數)
注意點 調⽤super() 必須是類建構函式中的第⼀條語句,否則編譯不通過
注意
每個⼦類構造⽅法的第⼀條語句,都是隱含地調⽤super(),如果⽗類沒有這種形式的構造函 數,那麼在編譯的時候就會報錯
public class Father { public Father(){ System.out.println("father ⽆參建構函式"); } } public class Children extends Father{ public Children(){ //預設存在,寫和不寫都⾏ super(); System.out.println("Child⽆參建構函式"); } }
this()和super()都指的是物件,均不可以在static環境中使⽤
包括:static變數,static⽅法,static語句塊。
建構函式 super和this
this 和super在建構函式中只能有⼀個,且都必須是建構函式當中的第⼀⾏
當⽗類的建構函式是⽆參建構函式時,在⼦類的建構函式中,不⽤顯式super()去調⽤⽗類的 建構函式,
當⽗類的建構函式是有參建構函式時,如果⼦類的建構函式中不寫super()進⾏調⽤⽗類的建構函式,編譯器會報錯。
java繼承後類的初始化順序
問題:靜態程式碼塊、⾮靜態程式碼、⽗類/⼦類⽆參構造⽅法、⽗類/⼦類的⼀般⽅法
father類
package day3; public class Father { static { System.out.println("父類靜態程式碼塊"); } public Father(){ System.out.println("father 無參建構函式"); } public Father(int age){ System.out.println("father 有參建構函式"); } public void sleep(){ System.out.println("father sleep方法"); } }
children類
package day3; public class Children extends Father{ static { System.out.println("Child靜態模組"); } public Children(){ System.out.println("Child 無參建構函式"); super.sleep(); } public void sleep(){ System.out.println("Child sleep方法"); } }
SuperTest類
package day3; public class SuperTest { public static void main(String [] args){ new Children().sleep(); } }
6.抽象
需求:動物都有年齡和名稱,但是吃的不⼀樣,⽺吃草,⽼⻁吃⾁,但是都是閉著眼睛睡覺的
⻋,都有名稱和價格,也有跑的⽅法,但是最⾼速度或者動⼒來源不⼀樣
當⽗類的某些⽅法不確定時,可以⽤abstract關鍵字來修飾該⽅法,即抽象⽅法,⽤abstract 來修飾該類,即抽象類
抽象類將事物的共性的東⻄提取出來,由⼦類繼承去實現,程式碼易擴充套件、易維護
java中的抽象類和抽象⽅法
//抽象類 abstract class 類名{ } //抽象⽅法,不能有⽅法主體 abstract 返回型別 ⽅法名();
Vehicle類
package day4; public abstract class Vehicle { public abstract void run(); public void stop(){ System.out.println("停在路上"); } }
Bicycle類
package day4; public class Bicycle extends Vehicle{ @Override public void run() { System.out.println("人力驅動"); } }
Auto類
package day4; public class Auto extends Vehicle { @Override public void run() { System.out.println("汽油驅動"); } }
AbstractTest類
package day4; public class AbstractTest { public static void main(String [] args){ Bicycle bicycle = new Bicycle(); Auto auto = new Auto(); bicycle.run(); bicycle.stop(); auto.run(); auto.stop(); // 不能 new 抽象類 // new Vehicle(); } }
抽象特點:
抽象類的特點
抽象類不能被例項化,因為抽象類中⽅法未具體化,這是⼀種不完整的類,所以不能直 接例項化,編譯⽆法通過
抽象類中不⼀定包含抽象⽅法,但是有抽象⽅法的類必定是抽象類
如果⼀個抽象類中可以沒有抽象⽅法,這樣做的⽬的是為了此類不能被例項化。
抽象類的⼦類必須給出抽象類中的抽象⽅法的具體實現,否則⼦類也是抽象類,需要⽤ abstract宣告
抽象類不能使⽤final關鍵字修飾,因為final修飾的類是⽆法被繼承
抽象⽅法的特點
抽象類中的抽象⽅法只是宣告,不包含⽅法體
抽象⽅法不能⽤private修飾,因為抽象⽅法必須被⼦類實現(覆寫),⽽private許可權 對於⼦類來 說是不能訪問的
⼀個類繼承了⼀個抽象類,那麼它必須全部覆寫抽象類中的抽象⽅法,當然也可以不全 部覆寫,如果 不覆寫全部抽象⽅法則這個⼦類也必須是抽象類
構造⽅法,類⽅法(即static 修飾的⽅法)不能宣告為抽象⽅法
7.介面
是抽象⽅法的集合,接⼝通常以interface來宣告,⼀個類通過繼承接⼝的⽅式,從⽽來繼承 接⼝的抽象⽅法
語法
interface 名稱 [extends 其他的接⼝名] { // 宣告變數 // 抽象⽅法 int getMoney(); }
接⼝的特點
接⼝的⽅法都是抽象⽅法,預設都是 public abstract,其他修飾符都會報錯
接⼝中可以含有變數,但是接⼝中的變數會被隱式的指定為 **public static final**
類描述物件的屬性和⽅法,⽽接⼝則包含類要實現的⽅法
接⼝⽆法被例項化,需要被實現才⾏
⼀個實現接⼝的類,必須實現接⼝內所描述的所有⽅法,否則就必須宣告為抽象類
接⼝和類的區別
接⼝沒有建構函式
接⼝⾥可以有靜態⽅法和⽅法體
接⼝中所有的⽅法必須是抽象⽅法(JDK8之後就不是)
接⼝不是被類繼承了,⽽是要被類實現
接⼝⽀持多繼承, 類不⽀持多個類繼承
接⼝的實現implements
當類實現接⼝的時候,類要實現接⼝中所有的⽅法,不然類必須宣告為抽象的類,使⽤ implements關鍵字實現所有接⼝
語法
class 類名 implements 接⼝名稱[, 其他接⼝名稱, 其他接⼝名稱]{ //要實現的⽅法 }
注意
⼀個類只能繼承⼀個類,但是能實現多個接⼝
接⼝能繼承另⼀個接⼝,接⼝的繼承使⽤extends關鍵字,和類繼承⼀樣
JDK8新特性
interface中可以有static⽅法,但必須有⽅法實現體,該⽅法只屬於該接⼝,接⼝名直接調⽤ 該⽅法
接⼝中新增default關鍵字修飾的⽅法,default⽅法只能定義在接⼝中,可以在⼦類或⼦接⼝ 中被重寫
default定義的⽅法必須有⽅法體
⽗接⼝的default⽅法如果在⼦接⼝或⼦類被重寫,那麼⼦接⼝實現物件、⼦類物件,調⽤該 ⽅法,以重寫為準
本類、接⼝如果沒有重寫⽗類(即接⼝)的default⽅法,則在調⽤default⽅法時,使⽤⽗類 定義的default⽅法邏輯
IPay類
package day4; public interface IPay { // static 修飾符定義靜態方法 static void staticMethod() { System.out.println("介面中的靜態方法"); } // default 修飾符定義預設方法,預設方法不是抽象方法,可以重寫也可以不重寫 default void defaultMethod() { System.out.println("介面中的預設方法"); } }
Alipay類
package day4; public class Alipay implements IPay { @Override public void defaultMethod() { System.out.println("重寫後的方法"); } }
interfaceTest類
package day4; public class interfaceTest { public static void main(String [] args){ IPay.staticMethod(); Alipay alipay = new Alipay(); alipay.defaultMethod(); } }
8.面向物件程式設計之InstanceOf關鍵詞和多型
InstanceOf 關鍵詞:是Java的⼀個⼆元操作符(運算子),也是Java的保留關鍵字
作用:判斷⼀個類是否實現了某個接⼝,或者判斷⼀個例項物件是否屬於⼀個類
語法
//如果該object 是該class的⼀個例項,那麼返回true。如果該object 不是該class的⼀個例項,或者object是null,則返回false boolean result = object instanceof class 引數: result :boolean型別。 object :必選項。任意物件表示式。 class:必選項。任意已定義的物件類。
物件型別強制轉換前的判斷
Person p1 = new Student(); //判斷物件p是否為Student類的例項 if(1p instanceof Student) { //向下轉型 Student s = (Student)p1; }
⽅法重寫和過載
⽅法重寫 overriede:⼦類對⽗類的允許訪問的⽅法的實現過程進⾏重新編寫,
注意點
返回值和形參都不能改變
⽗類的成員⽅法只能被它的⼦類重寫
final 和 static的⽅法不能被重寫
構造⽅法不能被重寫
訪問許可權不能⽐⽗類中被重寫的⽅法的訪問許可權更低
⽅法過載 overload
⼀個類⾥⾯,⽅法名字相同但引數不同,返回型別可以相同也可以不同
⽐如建構函式過載
注意核⼼區分
override是在不同類之間的⾏為,overload是在同⼀個類中的⾏為
總結:Java多型
同⼀個⾏為具有多個不同表現形式或形態的能⼒
常⻅的⽅式:繼承⽅法重寫、同類⽅法過載、抽象⽅法、接⼝
10.寫個計算器,能完成加減乘除運算
定義接⼝做引數
加減乘除定義4個類
定義⼀個靜態⼯具類,把下⾯的接⼝作為其中⼀個形參物件,傳遞具體的運算子類完成計算
ICompute類
package day4; //計算機介面 public interface ICompute { /** * 通過傳遞兩個引數,完成傳遞 * @param num1 * @param num2 * @return */ int computer(int num1, int num2); }
AddOper類
package day4; public class AddOper implements ICompute { @Override public int computer(int num1, int num2) { return num1 + num2; } }
SubOper類
package day4; public class SubOper implements ICompute { @Override public int computer(int num1, int num2) { return num1 - num2; } }
MulOper類
package day4; public class MulOper implements ICompute { @Override public int computer(int num1, int num2) { return num1*num2; } }
DeviceOper類
package day4; public class DeviceOper implements ICompute { @Override public int computer(int num1, int num2) { try { return num1/num2; }catch (Exception e){ e.printStackTrace(); } return -1; } }
UseComputer類
package day4; public class UseComputer { public static void computer(ICompute compute, int num1, int num2){ int result = compute.computer(num1, num2); System.out.println(result); } public static void main(String [] args){ UseComputer.computer(new AddOper(),25,5); UseComputer.computer(new SubOper(),25,5); UseComputer.computer(new MulOper(),25,5); UseComputer.computer(new DeviceOper(),25,0); } }