java狐狸游戏_Java继承
一種類與類之間的關系
使用已存在的類的定義作為基礎建立新類
新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類
子類只能繼承一個父類
package com.imooc.animal;
public class Animal {
private String name;//昵稱
private int month;//月份
private String species;//品種
public Animal() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
//吃東西
public void eat() {
System.out.print(this.getName()+"吃東西");
}
}
package com.imooc.animal;
public class Cat extends Animal{
private double weight;//體重
public Cat() {
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
//跑動的方法
public void run() {
//子類可以訪問父類非私有成員
System.out.print(this.getName()+"是一只"+this.getSpecies()+",它在快樂地奔跑");
}
}
package com.imooc.animal;
public class Dog extends Animal {
private String sex; //性別
public Dog() {
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
//睡覺的方法
public void sleep() {
System.out.println(this.getName()+"現在"+this.getMonth()+"月大"+",正在睡覺");
}
/*
* 方法重載:
* 1.同一個類中
* 2.方法名相同,參數列表不同(參數順序、個數、類型)
* 3.方法返回值、訪問修飾符任意
* 4.與方法的參數名無關
private String sleep(String name) {
return "";
}
public void sleep(String name,int month) {
}
public void sleep(int month,String name) {
}
* */
}
import com.imooc.animal.Animal;
import com.imooc.animal.Cat;
import com.imooc.animal.Dog;
public class Test {
public static void main(String[] args) {
Cat one=new Cat();
one.setName("花花");
one.setSpecies("中華田園貓");
one.eat();
one.run();
Dog two=new Dog();
two.setName("妞妞");
two.setMonth(1);
two.eat();
two.sleep();
//父類不可以訪問子類特有成員,即便它是公有的
Animal three=new Animal();
//three.run();//報錯
}
}
方法重寫
語法規則:
在子類中定義
方法名和參數類型、順序、個數(不包括參數名)都要與父類繼承的方法相同
public void eat(String name) {
System.out.println(name+"在吃東西");
}
public void jump() {
System.out.println("跳躍是一種本能");
}
/*
* 方法重寫:
* 1.有繼承關系的子類中
* 2.方法名相同,參數列表相同(參數順序、個數、類型)
* 3.與方法的參數名無關
* 4.方法的返回值和訪問修飾符是可以允許有變化的
*/
//當子類重寫父類方法后,子類對象調用的是重寫后的方法
public void eat() {
System.out.println(this.getName()+"最近沒有食欲");
}
public void eat(String month) {
System.out.println(month+"最近沒有食欲");
}
/*報錯:與父類中的jump方法不兼容
* 返回值為void或者基本數據類型,要求父子完全一致
* 返回值為引用類型時,可以是父類或其子類
public int jump() {
System.out.println("狗狗是助跑式跳躍");
return 1;
}
*/
在子類中可以定義與父類當中重名的屬性,優先執行子類當中的賦值
訪問修飾符
公有的:public:允許在任意位置訪問
私有的:private:只允許在本類中進行訪問
受保護的:protected:允許在當前類、同包子類/非子類、跨包子類調用;跨包非子類不允許
默認:允許在當前類、同包子類/非子類調用;跨包子類/非子類不允許調用
訪問修飾符對方法重寫的影響
訪問修飾符的訪問范圍需要大于等于父類的訪問范圍
super關鍵字的使用
super:父類對象的引用
super.eat();
super.x=4;
tip:父類的構造方法不允許被繼承、不允許被重寫,但是會影響子類對象的實例化
子類的構造的過程中必須調用其父類的構造方法
如果子類的構造方法中沒有顯式標注,則系統默認調用父類無參構造方法
如果子類構造方法中既沒有顯式標注,且父類中沒有無參的構造方法,則編譯一定出錯
Implicit super constructor Parent1() is undefined. Must explicitly invoke another constructor
隱式的父類無參構造方法未找到,必須顯式地調用另外的構造方法
使用super()可以指定父類構造方法,super()必須放在子類構造方法有效代碼第一行
super();
super(String name,int month);
this和super都不能在靜態方法中調用,兩者在調用構造方法時不能共存
繼承后的初始化順序
類的加載:父類靜態成員--子類靜態成員--子類對象實例化(父類對象構造,包括屬性、構造代碼塊、構造方法--子類對象構造)
訪問修飾符不影響靜態成員加載順序,跟書寫位置有關
Object類
Object類是所有類的父類
一個類沒有使用extends關鍵字明確標識繼承關系,則默認繼承Object類(包括數組)
Java中的每個類都可以使用Object中定義的方法
子類中方法可以不經過重寫,直接重載父類的方法
例如equals()方法(等效于==),當繼承Object中的equals方法時,比較的是兩個引用是否指向同一個對象,即是否指向同一片內存空間,子類可以通過重寫equals方法的形式,改變比較的內容
Animal one=new Animal("花花",2);
Animal two=new Animal("花花",2);
boolean flag=one.equals(two);
System.out.println("one 和 two的引用比較"+flag);
System.out.println("one 和 two的引用比較"+(one==two));
String str1=new String("hello");
String str2=new String("hello");
flag=str1.equals(str2);
System.out.println("str1 和 str2的引用比較"+flag);
System.out.println("str1 和 str2的引用比較"+(str1==str2));
public boolean equals(Object obj) {
if(obj==null) {
return false;
}
//強制轉換為Animal類型
Animal temp=(Animal)obj;
//字符串用equals()比較,int型數據用==比較
if(this.getName().equals(temp.getName())&&(this.getMonth()==temp.getMonth())) {
return true;
}else {
return false;
}
}
//方法重載
public boolean equals(Animal obj) {
if(obj==null) {
return false;
}
if(this.getName().equals(obj.getName())&&(this.getMonth()==obj.getMonth())) {
return true;
}else {
return false;
}
}
if語句中,可以兩個都用equals或者兩個都用==進行比較嗎?
由于通過Animal類型參數重載了equals(),所以代碼運行時自動定位類型匹配方法
//重寫toString()方法
public String toString() {
return "昵稱:"+this.getName()+";年齡:"+this.getMonth();
}
/*toString測試:
* 1.輸出對象名時,默認會直接調用類中的toString方法
* 2.繼承Object中的toString方法時,輸出對象的字符串表示形式:類型信息+@+地址信息
* 3.子類可以通過重寫toString方法的形式,改變輸出的內容以及表現形式
*/
System.out.println(one.toString());
System.out.println(one);
System.out.println(str1);
==比較的是變量里存儲的值,對于基本數據類型,變量里存儲的是數值,==比較的是數值是否相等;對于引用數據類型(例如String、自定義類等),變量里存的是對象的內存地址,==默認比較的是是否指向同一內存空間,也就是地址是否相同。
final
final class:該類沒有子類,不允許被繼承 可寫成public final class或final public class
不允許子類重寫,在方法的返回值前加final,同時可以被子類正常繼承使用,不能修飾構造方法
變量分為以下兩類:
final 方法內局部變量:只要在具體被使用之前進行賦值即可,一旦賦值不允許被修改
final 類當中的成員屬性:賦值過程:1.定義直接初始化 2.構造方法 3. 構造代碼塊
不賦值系統會報錯
提示菜單快捷鍵:alt+/ 可以快速生成重寫方法模板
final 引用數據類型 實例化后不允許再進行引用地址的修訂,但屬性值仍可更改
static+final 表示全局不允許修訂的內容(方法和變量),如配置信息
注解
可以聲明在包、類、屬性、方法、局部變量、方法參數等的前面,用來對這些元素進行說明、注釋
按照運行機制可以分為:源碼注解(@Override)、編譯時注解(@NotNull)、運行時注解(甚至會影響到運行邏輯@Autowired)
在當前階段保留,在進行下一階段時會被丟棄
按照來源分:來自JDK的注解(@Override)、來自第三方的注解(@Autowired)、我們自己定義的注解
元注解
定義注解的注解,對注解進行標注
父類的靜態方法無法被重寫
public static Animal create(){
return new Animal();
}
public static Dog create(){
return new Dog();
}
不會報錯的原因是:系統認為create是Dog類專屬的一個方法,與父類無關,更不是方法重寫
總結
以上是生活随笔為你收集整理的java狐狸游戏_Java继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tcpdump命令使用详解
- 下一篇: python爬虫实时更新数据_爬虫的增量