面向物件(2)
類屬性
-
當一個屬性被static修飾的時候,就叫做類屬性,又叫做靜態屬性,當一個屬性被宣告成類屬性,那么所有的物件,都共享一個值
-
不同物件的物件屬性的值都可能不一樣;但是所有物件的類屬性的值,都是一樣的
package charactor; public class Hero { public String name; //實體屬性,物件屬性,非靜態屬性 protected float hp; static String copyright;//類屬性,靜態屬性 public static void main(String[] args) { Hero garen = new Hero(); garen.name = "蓋倫"; Hero.copyright = "著作權由Riot Games公司所有"; System.out.println(garen.name); //System.out.println(garen.copyright); System.out.println(Hero.copyright); Hero teemo = new Hero(); teemo.name = "提莫"; System.out.println(teemo.name); System.out.println(teemo.copyright); } }
-
-
訪問類屬性:
物件.類屬性或者類.類屬性(推薦后者) -
如果一個屬性,不同的物件不一樣,比如name,這樣的屬性就應該設計為物件屬性,因為它是跟著物件走的
-
如果一個屬性,所有的物件都共享,那么就應該設計為類屬性,類屬性不會因為物件的不同而取不同的值, 這樣的屬性,就適合設計為類屬性
類方法
-
類方法: 又叫做靜態方法;物件方法: 又叫實體方法,非靜態方法
-
訪問一個物件方法,必須建立在有一個物件的前提的基礎上;訪問類方法,不需要物件的存在,直接就訪問
package charactor; public class Hero { public String name; protected float hp; //實體方法,物件方法,非靜態方法 //必須有物件才能夠呼叫 public void die(){ hp = 0; } //類方法,靜態方法 //通過類就可以直接呼叫 public static void battleWin(){ System.out.println("battle win"); } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "蓋倫"; //必須有一個物件才能呼叫物件方法 garen.die(); Hero teemo = new Hero(); teemo.name = "提莫"; //無需物件,直接通過類呼叫 Hero.battleWin(); //teemo.battlewin(); } } -
呼叫類方法:
物件.類方法或者類.類方法(推薦后者) -
如果在某一個方法里,呼叫了物件屬性,那么這個方法,就必須設計為物件方法
-
如果一個方法,沒有呼叫任何物件屬性,那么就可以考慮設計為類方法
-
類方法(靜態方法)不能直接訪問非靜態屬性,因為在記憶體中是現有靜態內容后有非靜態內容
-
靜態方法中不能用this關鍵字,因為this代表當前物件,通過誰呼叫的方法誰就是物件
靜態代碼塊
-
靜態代碼塊格式:
static{``} -
靜態代碼塊的特點:當第一次用到本類時,靜態代碼塊執行唯一一次
靜態內容總優先于非靜態,所以靜態代碼塊比構造方法先執行
package charactor; public class Hero { //靜態代碼塊 static{ System.out.println("靜態代碼塊執行"); } public Hero{ System.out.println("構造方法執行"); } public static void main(String[] args) { Hero one = new Hero();//靜態代碼塊和構造方法均執行 Hero two = new Hero();//僅有構造方法執行 } } -
靜態代碼塊的用途:用來一次性地對靜態成員變數進行賦值
抽象方法和抽象類
-
在類中宣告一個方法,這個方法沒有實作體,是一個“空”方法,這樣的方法就叫抽象方法,使用修飾符
abstract -
抽象方法所在的類必須是抽象類,同樣用
abstract修飾- 抽象類可以沒有抽象方法,只要保證抽象方法所在的類是抽象類即可
- 沒有抽象方法的抽象類也不能直接創建物件,在一些特殊場景下有用途
-
抽象類不能直接創建物件,必須用一個子類繼承抽象父類
-
子類必須覆寫重寫抽象父類中的所有抽象方法
覆寫重寫:子類去掉抽象方法的 abstract關鍵字,然后補上方法體大括號
//抽象父類 public abstract class Hero { String name; //姓名 float hp;//血量 int moveSpeed; //移動速度 //定義抽象方法 public abstract void attack(); } //////////////////////////////////// //抽象子類 public class ADHero extends Hero { @Override//覆寫重寫 public void attack(){ System.out.println("進行物理攻擊"); } public static void main(String[] args){ ADHero h1 = new ADHero(); h1.attack(); } } -
當子類沒有重寫覆寫抽象父類的所有方法,則該子類也應該為抽象類
//抽象父類 public abstract class Hero { //String name; //姓名 float hp;//血量 int moveSpeed; //移動速度 //定義抽象方法 public abstract void attack(); public abstract void rename(String name); } //////////////////////////// //子類也是抽象類 public abstract class ADHero extends Hero { @Override//覆寫重寫 public void attack(){ System.out.println("進行物理攻擊"); } // public abstract void rename(String name);未進行覆寫重寫 } ///////////////////////////// public class H1 extends ADHero{ @Override public void rename(String name){ System.out.println("姓名是" + name); } public static void main(String[] args){ // ADHero garen = new ADHero;//ADhero仍為抽象類不能直接創建,會報錯 H1 garen = new H1(); garen.attack(); garen.rename("garen"); } }
ArrayList 集合
-
ArrayList是針對物件陣列的一個包,即物件可存放于陣列中
-
ArrayList<E>中代表泛型,即在集合中的所有元素都是統一型別,泛型只能是參考型別不能是基本型別 -
對于ArrayList合集,直接列印得到的是[內容],而不是地址值
-
若希望向ArrayList合集中存盤基本資料型別,必須使用基本型別對應的包裝類
byte-->Byte short-->Short int-->Integer long-->Long
float-->Float double-->Double char-->Character boolean-->Boolen
package arrayList; import java.util.ArrayList; import java.util.Random; public class DemoArrayList { public static void main(String[] args){ //創建一個ArrayList合集 //集合名稱為listB,集合內部都是int型別的資料 //利用包裝類匯入基本型別 ArrayList<Integer> listB = new ArrayList<>(); for (int i=1; i <= 6; i++){ Random random = new Random(); int num = random.nextInt(33) + 1;//產生1-33亂數 listB.add(num); } System.out.println(listB); } }
-
-
常用方法:
-
.add(E):向集合內添加一些資料,引數型別與泛型一致 -
.get(index):從集合中獲取元素,引數是索引編號,回傳值是對應位置的元素 -
.remove(index):從集合中洗掉元素,引數是索引編號,回傳值是被刪掉的元素 -
.size():獲取集合尺寸長度,回傳值是集合中包含的元素個數
-
package arrayList;
public class Hero {
String name; //姓名
private float hp;//血量
int moveSpeed; //移動速度
public Hero(String name, float hp, int moveSpeed){
this.name = name;
this.hp = hp;
this.moveSpeed = moveSpeed;
}
public void setName(String name){
this.name = name;
}
public void setHp(float num){
if(num < 0)
System.out.println("資料不合理");
else
hp = num;
}
public void setMoveSpeed(int num){
if(num < 0)
System.out.println("資料不合理");
else
moveSpeed = num;
}
public String getName(){
return name;
}
public float getMoveSpeed(){
return moveSpeed;
}
public float getHp(){
return hp;
}
}
//////////////////////////////////////////////
package arrayList;
import java.util.ArrayList;
public class HeroList {
//將物件存入集合中
public static void main(String[] args){
ArrayList<Hero> list = new ArrayList<>();
Hero garen = new Hero("garen", 50, 100);
Hero temmo = new Hero("temmo", 40, 80);
list.add(garen);
list.add(temmo);
//遍歷集合
for (int i=0; i < list.size(); i++){
Hero hero = list.get(i);
System.out.println("名字是" + hero.getName() +
"血量為" + hero.getHp() + "移動速度是" + hero.getMoveSpeed());
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/178804.html
標籤:Java
