[转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍
參考鏈接: 可以重寫(xiě)Java中的私有方法嗎
JAVA面向?qū)ο笾a塊與繼承?
代碼塊分類(lèi)?
局部代碼塊?
作用:限制變量生命周期
書(shū)寫(xiě)位置:在方法中?
構(gòu)造代碼塊?
開(kāi)發(fā)中很少使用
書(shū)寫(xiě)位置:類(lèi)中? 方法外
調(diào)用時(shí)機(jī):如果你有構(gòu)造代碼塊 系統(tǒng)會(huì)幫你調(diào)用 幫你在創(chuàng)建對(duì)象時(shí)調(diào)用?
靜態(tài)代碼塊(一定是被static修飾)?
依賴類(lèi) 隨著類(lèi)的加載而加載
注意:只加載一次(系統(tǒng)只創(chuàng)建一次 不管你調(diào)用多少對(duì)象)
應(yīng)用場(chǎng)景:U盤(pán)裝載驅(qū)動(dòng)程序(第二次插入U(xiǎn)盤(pán),不會(huì)再加載驅(qū)動(dòng)程序)
? ? ? ? ?加載驅(qū)動(dòng)(數(shù)據(jù)庫(kù)驅(qū)動(dòng) JDBC)?
同步代碼塊(多線程)?
這里暫時(shí)不做介紹 后續(xù)給予說(shuō)明?
代碼示例?
public class Demo24 {
? ? ? ? ? ?//第三代碼塊
? ? {
? ? ? ? ?int a = 10;
? ? ? ? ?System.out.println(a);
? ? ? ? ?System.out.println("我是Demo24構(gòu)造代碼塊");
? ? }
? ? public static void main(String[] args){
? ? ? ? Person2 person = new Person2();
? ? ? ? person.name = "張三";
? ? ? ? person.age = 15;
? ? ? ? person.sayHi();
? ? ? ? System.out.println("我是main函數(shù)中得普通方法");
? ? ? ? {
? ? ? ? ? ? System.out.println("我是局部代碼塊");
? ? ? ? }
? ? ? ? Person2 person1 = new Person2("李四",22);
? ? }
}
class Person2{
? ? String name;
? ? int age;
? ? //第一個(gè)代碼塊
? ? static {
? ? ? ? ? System.out.println("我是person類(lèi)的靜態(tài)代碼塊");
? ? }
? ? //第二個(gè)代碼塊
? ? {
? ? ? ? //每一個(gè)對(duì)象 都會(huì)調(diào)用同一個(gè)方法 這時(shí)可以使用
? ? ? ? ? ?sleep();
? ? ? ? ? ?System.out.println("我是構(gòu)造代碼塊");
? ? }
? ? public Person2(){
? ? ? ? ? ?System.out.println("我是無(wú)參數(shù)的構(gòu)造方法");
? ? }
? ? public Person2(String name, int age){
? ? ? ? ? this.name = name;
? ? ? ? ? this.age = age;
? ? ? ? ? System.out.println("我是有參數(shù)的構(gòu)造方法");
? ? }
?
? ? public String getName(){
? ? ? ? ? ? return name;
? ? }
? ? public void setName(){
? ? ? ? ? ? this.name = name;
? ? }
? ? public int getAge(){
? ? ? ? ? ? return age;
? ? }
? ? public void setAge(int age){
? ? ? ? ? ? ?this.age = age;
? ? }
?
? ? public void sayHi(){
? ? ? ? ? ?System.out.println("姓名:" + name + "年齡:" + age);
? ? }
?
? ? ?public void sleep(){
? ? ? ? ? System.out.println("睡覺(jué)");
? ? ?}
}
?
?
運(yùn)行結(jié)果?
我是person類(lèi)的靜態(tài)代碼塊
睡覺(jué)
我是構(gòu)造代碼塊
我是無(wú)參數(shù)的構(gòu)造方法
姓名:張三年齡:15
我是main函數(shù)中得普通方法
我是局部代碼塊
睡覺(jué)
我是構(gòu)造代碼塊
我是有參數(shù)的構(gòu)造方法
姓名:李四年齡:22?
解釋?
當(dāng)程序運(yùn)行時(shí) 會(huì)先加載Demo01.class文件,進(jìn)入.class文件后,會(huì)尋找靜態(tài)代碼塊,如果沒(méi)有,會(huì)繼續(xù)尋找構(gòu)造代碼塊,由于沒(méi)有
Demo24類(lèi)的實(shí)例對(duì)象,所有構(gòu)造代碼塊與構(gòu)造方法均不會(huì)執(zhí)行,如果另外新建一個(gè)類(lèi),Demo25,在Demo25類(lèi)中建立Demo24類(lèi)的實(shí)例
對(duì)象,Demo24類(lèi)中的構(gòu)造代碼塊與構(gòu)造方法便會(huì)執(zhí)行,之后會(huì)首先尋找main函數(shù),找到main函數(shù)后,(局部代碼塊定義在方法中,在該
方法中并沒(méi)有優(yōu)先級(jí))會(huì)首先遇到Person2類(lèi),遇到Person2 person = new Person2();這時(shí)會(huì)加載Person2類(lèi),
加載Person2.class文件,靜態(tài)代碼塊與靜態(tài)方法和靜態(tài)屬性一樣,會(huì)隨著類(lèi)的加載而加載,存放在方法區(qū)的靜態(tài)區(qū),與對(duì)象無(wú)關(guān),所
以在加載Person2.class文件時(shí),會(huì)將static代碼塊一同加載,所有會(huì)輸出'我是Person類(lèi)的靜態(tài)代碼塊',之后需要new一個(gè)對(duì)象,
繼續(xù)執(zhí)行Person2類(lèi)中的代碼,執(zhí)行時(shí),會(huì)先尋找有沒(méi)有構(gòu)造代碼塊(構(gòu)造代碼塊存放在類(lèi)中方法外,優(yōu)先級(jí)高于構(gòu)造方法);發(fā)現(xiàn)有構(gòu)
造代碼塊,即先執(zhí)行構(gòu)造代碼塊,構(gòu)造代碼塊中有sleep方法,故先執(zhí)行sleep方法,打印'睡覺(jué)',之后執(zhí)行下一句,打印'我是構(gòu)造代碼
塊',構(gòu)造代碼塊執(zhí)行之后,會(huì)執(zhí)行相應(yīng)的構(gòu)造方法(有參或者無(wú)參),構(gòu)造代碼塊優(yōu)先于構(gòu)造方法執(zhí)行,與構(gòu)造代碼塊的位置無(wú)關(guān),new
對(duì)象的時(shí)候沒(méi)有傳遞參數(shù),所有這里調(diào)用無(wú)參構(gòu)造方法,打印'我是無(wú)參數(shù)的構(gòu)造方法',之后回到Demo01函數(shù),對(duì)對(duì)象中的變量進(jìn)行賦
值,賦完值后,調(diào)用對(duì)象的sayHi方法,打印'姓名:張三','年齡:15',隨后執(zhí)行到打印語(yǔ)句,打印出"我是main函數(shù)中得普通方法",
之后遇到局部代碼塊,打印"我是局部代碼塊"(順序執(zhí)行),當(dāng)new第二個(gè)Person2對(duì)象時(shí),靜態(tài)代碼塊不會(huì)再執(zhí)行,即在函數(shù)運(yùn)行過(guò)
程中,只會(huì)加載一次,非靜態(tài)構(gòu)造代碼塊將會(huì)繼續(xù)加載,第二次new對(duì)象時(shí)候,先執(zhí)行構(gòu)造代碼塊,構(gòu)造代碼塊中有sleep方法,所有會(huì)
先執(zhí)行sleep方法,打印"睡覺(jué)",隨后打印"我是構(gòu)造代碼塊",new對(duì)象時(shí)候,傳進(jìn)來(lái)了參數(shù),所有會(huì)調(diào)用Person2類(lèi)中的有參數(shù)構(gòu)造
方法,打印"我是有參數(shù)的構(gòu)造方法",賦值后,調(diào)用sayHi方法,打印"姓名:李四年齡22",函數(shù)運(yùn)行結(jié)束.?
繼承?
繼承特點(diǎn)?
1.減少你的代碼量
2.讓類(lèi)與類(lèi)之間產(chǎn)生關(guān)聯(lián)(產(chǎn)生 父子的)?
繼承弊端?
當(dāng)父類(lèi)中添加新德屬性時(shí)候,比如白血病,子類(lèi)即使不想繼承這個(gè)屬性,卻還是由于
繼承的關(guān)系,自動(dòng)得到了白血病這個(gè)屬性?
注意?
1.繼承時(shí)? 可把多個(gè)類(lèi)中 相同的功能或方法 抽取出來(lái) 重新構(gòu)造一個(gè)類(lèi)出來(lái)??
把這些類(lèi)建立 繼承關(guān)系
2.建立繼承關(guān)系的同時(shí) 一定要符合邏輯(切記不要為了繼承而繼承)
3.繼承使用關(guān)鍵字:extends?
舉例?
繼承:
手機(jī)類(lèi)? <打電話 發(fā)短信 玩游戲>
蘋(píng)果手機(jī)類(lèi) 繼承 手機(jī)類(lèi) <打電話 發(fā)短信 玩游戲 爆炸>
小米手機(jī)類(lèi) 繼承 手機(jī)類(lèi) <打電話 發(fā)短信 玩游戲 暖手功能>?
項(xiàng)目經(jīng)理:姓名 工資 工號(hào) 分紅
程序員:姓名 工資 工號(hào)
?
項(xiàng)目經(jīng)理 繼承 程序員 就繼承了姓名 工資 和 工號(hào) ,特有功能 分紅 這樣不行?
不符合邏輯
應(yīng)該是相同的功能抽取出來(lái)
員工類(lèi) 姓名 工資 工號(hào)
項(xiàng)目經(jīng)理 和 程序員 繼承員工類(lèi)? 這樣才符合邏輯?
注意?
如果是繼承關(guān)系 一定符合什么是什么
項(xiàng)目經(jīng)理是員工 子類(lèi)是父類(lèi)的?
動(dòng)物 貓 狗 馬
貓 是 動(dòng)物 √
動(dòng)物 是 貓 ×
?
水果(父類(lèi)) 香蕉 蘋(píng)果 橘子
水果 是 香蕉 ×
香蕉 是 水果 √?
繼承的寫(xiě)法?
class 子類(lèi) extends 父類(lèi){
?
}?
代碼示例?
/*
?* 貓類(lèi)
?* 姓名 顏色? 種類(lèi) 會(huì)睡覺(jué) 會(huì)抓老鼠
?* 狗類(lèi)?
?* 姓名 顏色? 種類(lèi) 會(huì)睡覺(jué) 會(huì)啃骨頭
?*/
?
// 抽取出 相同部分 組成 動(dòng)物類(lèi)
public class Demo02{
? ? public static void main(String[] args){
? ? ? ? Cat cat = new Cat();
? ? ? ? cat.name = "湯姆";
? ? ? ? cat.color = "灰色";
? ? ? ? cat.kind = "灰貓";
? ? ? ? cat.sleep();
? ? ? ? cat.sayHi();
? ? }
}
?
class Animal{
? ? String name;
? ? String color;
? ? String kind;
?
? ? public void sleep(){
? ? ? ? System.out.println("睡覺(jué)");
? ? }
? ? public void sayHi(){
? ? ? ? System.out.println("姓名:" + name +"顏色:" + color + "種類(lèi):" + kind);
? ? }
}
?
class Cat extends Animal{
? ? public void hitMouse(){
? ? ? ? System.out.println("抓老鼠");
? ? }
}
?
class Dog extends Animal{
? ? public void eatBone(){
? ? ? ? System.out.println("啃骨頭");
? ? }
}?
運(yùn)行結(jié)果:?
抓老鼠
睡覺(jué)
姓名:湯姆顏色:灰色種類(lèi):灰貓?
JAVA中的繼承?
注意?
1.java 只允許 單繼承(多繼承 可以 使用 接口 來(lái)間接實(shí)現(xiàn))
2.java 中 允許 多層繼承(爺爺 父親 兒子 孫子 重孫子....)
?
java中 最頂層的父類(lèi)(最基礎(chǔ)類(lèi)) Object類(lèi)
如果我這個(gè)類(lèi)沒(méi)有寫(xiě) 繼承哪個(gè)父親 默認(rèn)就是繼承 Object類(lèi)?
1.如果我要使用 這些 類(lèi)中 共有的方法(屬性) 使用 哪個(gè)類(lèi)?
? ? 創(chuàng)建當(dāng)前繼承中最 頂端的 類(lèi) 去使用
2.如果我要使用 這些 類(lèi)中 特有的方法(屬性) 使用 哪個(gè)類(lèi)?
? ? 創(chuàng)建當(dāng)前繼承中 最末端類(lèi) 去使用?
代碼示例?
public class Demo03 extends Object{
?
}
//A類(lèi) 爺爺類(lèi) B類(lèi) 是父親 C類(lèi) 是 孫子類(lèi)
//A類(lèi)中又name C類(lèi)中 會(huì)叫爺爺
?
class A extends Object{
? ? String name;
}
?
class B extends A{
?
}
class C extends B{
? ? public void speak(){
? ? ? ? System.out.println("會(huì)叫爺爺");
? ? }
}?
構(gòu)造方法能不能被繼承??
爺爺 父親 兒子
爹 和 兒子 都用同一中 方法生出來(lái) 行嗎? 亂
奶奶不愿意? 媽媽不愿意
?
構(gòu)造方法是不能被繼承的
?
為了保證繼承的完整性 在你創(chuàng)建對(duì)象的時(shí)候
如果你不調(diào)用 父類(lèi)的構(gòu)造方法?
系統(tǒng)會(huì)幫你去調(diào)用 父類(lèi)的無(wú)參構(gòu)造方法?
代碼舉例?
public class Demo04{
? ? public static void main(String[] args){
? ? ? ? Son son = new Son();
? ? ? ? son.name = "張三";
? ? ? ? son.sayHi();
?
? ? ? ? //有參構(gòu)造對(duì)象
? ? ? ? Son son2 = new Son("小明");
? ? ? ? son2.sayHi();
? ? }
}
?
class Father{
? ? String name;
? ? //有參 無(wú)參 構(gòu)造方法
? ? public Father(){
? ? ? ? System.out.println("我是無(wú)參構(gòu)造方法");
? ? }
? ? public Father(String name){
? ? ? ? this.name = name;
? ? ? ? System.out.println("我是有參構(gòu)造方法");
? ? }
? ? public void sayHi(){
? ? ? ? System.out.println("姓名:" + name);
? ? }
}
?
class Son extends Father{
? ? //無(wú)參構(gòu)造
? ? public Son(){
? ? ? ? //如果你沒(méi)有在子類(lèi)的構(gòu)造方法中 調(diào)用父類(lèi)的構(gòu)造方法
? ? ? ? //系統(tǒng)會(huì)默認(rèn)給你的子類(lèi)構(gòu)造方法中 添加一行代碼
? ? ? ? super();//調(diào)用父類(lèi)的 無(wú)參構(gòu)造方法
? ? ? ? System.out.println("我是兒子類(lèi)的無(wú)參構(gòu)造方法");
? ? }
? ? //有參的
? ? public Son(String name){
? ? ? ? //如果你沒(méi)有在子類(lèi)的構(gòu)造方法中 調(diào)用父類(lèi)的構(gòu)造方法
? ? ? ? //系統(tǒng) 會(huì)默認(rèn) 給你的子類(lèi) 構(gòu)造方法中 添加一行代碼
? ? ? ? super(); //系統(tǒng)幫你調(diào)用父類(lèi)的構(gòu)造方法
? ? ? ? this.name = name;
? ? ? ? System.out.println("我是兒子類(lèi)的有參構(gòu)造方法");
? ? }
}?
輸出結(jié)果?
我是爸爸類(lèi)無(wú)參的構(gòu)造方法
我是兒子類(lèi)無(wú)參構(gòu)造方法
張三
?
我是爸爸類(lèi)無(wú)參的構(gòu)造方法
我是兒子類(lèi)有參的構(gòu)造方法
小明?
結(jié)果解釋?
當(dāng)new一個(gè)Son對(duì)象時(shí),由于沒(méi)有傳進(jìn)去參數(shù),所以會(huì)先調(diào)用兒子類(lèi)的無(wú)參構(gòu)造方法,
由于Son類(lèi)是Father的子類(lèi),所有在子類(lèi)的構(gòu)造方法中會(huì)自動(dòng)調(diào)用父類(lèi)的無(wú)參構(gòu)造方
法,從而實(shí)現(xiàn)Son類(lèi)的實(shí)例對(duì)象同時(shí)具有Son類(lèi)與Father類(lèi)的屬性與方法,因此先打印
父類(lèi)無(wú)參構(gòu)造方法中的"我是爸爸類(lèi)的無(wú)參構(gòu)造方法",之后返回子類(lèi)構(gòu)造方法,打印
子類(lèi)無(wú)參構(gòu)造器中得"我是兒子類(lèi)無(wú)參構(gòu)造方法",之后對(duì)Son的nane屬性賦值,調(diào)用s
ayHi方法將姓名打出
?
第二次new一個(gè)Son類(lèi)對(duì)象的時(shí)候,傳進(jìn)去姓名這個(gè)參數(shù),所有會(huì)調(diào)用Son類(lèi)中得有參
構(gòu)造方法,該有參構(gòu)造方法中第一句會(huì)先執(zhí)行super(),即會(huì)先執(zhí)行父類(lèi)無(wú)參構(gòu)造方
法,向上調(diào)用父類(lèi)構(gòu)造方法時(shí),沒(méi)有傳進(jìn)去參數(shù),所有不會(huì)調(diào)用父類(lèi)有參構(gòu)造方法,打
印"我是爸爸類(lèi)無(wú)參構(gòu)造方法"后,返回子類(lèi),即Son類(lèi),打印"我是兒子類(lèi)有參構(gòu)造方
法",然后將姓名賦值,隨后返回main函數(shù),調(diào)用sayHi方法將name打印出來(lái).?
super關(guān)鍵字?
super 用于指向子類(lèi)對(duì)象中的父類(lèi)對(duì)象(構(gòu)造方法)? 相當(dāng)于父類(lèi)的對(duì)象
super 調(diào)用對(duì)象 super.對(duì)象
super 調(diào)用方法 super.方法()
?
?
super(); 調(diào)用父類(lèi)的構(gòu)造方法
this();? 調(diào)用的是本類(lèi)的構(gòu)造方法?
代碼示例?
public class Demo05{
? ? public static void main(String[] args){
? ? ? ? TestB b = new TestB();
? ? ? ? b.fun();
? ? }
}
?
class TestA{
? ? int num1 = 10;
? ? int num2 = 20;
?
? ? public void sayHi(){
? ? ? ? System.out.println("我是父類(lèi)的sayHi方法");
? ? }
}
?
class TestB extends TestA{
? ? int num1 = 30;
?
? ? public void fun(){
? ? ? ? //使用this時(shí) 會(huì)先在本類(lèi)中尋找該屬性
? ? ? ? //沒(méi)找到 就去父類(lèi)中找? 就近原則
? ? ? ? System.out.println(this.num1);? //30
? ? ? ? System.out.println(this.num2);? //20
? ? ? ? System.out.println(this.num3);? //10
? ? }
}?
思考:如果父類(lèi)中沒(méi)有無(wú)參構(gòu)造方法 咋整??
建議:不管是父類(lèi) 還是 子類(lèi) 構(gòu)造方法一定要寫(xiě)全,避免出現(xiàn)問(wèn)題?
代碼舉例?
public class Demo04{
?
}
class Phone{
? ? String name;
?
? ? public Phone(){
?
? ? }
? ? public Phone(String name){
? ? ? ? this.name = name;
? ? }
}
class MI extends Phone{
? ? public MI(){
? ? ? ? //子類(lèi)的構(gòu)造方法 如果你什么都不寫(xiě) 會(huì)默認(rèn)調(diào)父類(lèi)無(wú)參構(gòu)造
? ? ? ? //如果父類(lèi)中 沒(méi)有無(wú)參構(gòu)造 就證明父類(lèi)中一定有有參的構(gòu)造方法
? ? ? ? //父類(lèi)構(gòu)造方法無(wú)論有參 還是 無(wú)參, 子類(lèi)的構(gòu)造方法都必須要調(diào)用一個(gè)
?
?
? ? ? ? //必須手動(dòng)指定一個(gè)有參構(gòu)造方法去調(diào)用
? ? ? ? super("Note2");
? ? }
? ? public MI(String name){
? ? ? ? super(name);
? ? }
}?
方法的重寫(xiě)?
思考: 如果父類(lèi) 和 子類(lèi)的 方法 重名了,咋整?能不能重名?
?
答案是可以? 方法的重寫(xiě)?
注意?
1.方法的聲明完全一致的 叫方法的重寫(xiě)
2.方法的重寫(xiě)建立在類(lèi)與類(lèi)之間有繼承關(guān)系(子類(lèi)重寫(xiě)父類(lèi)的方法)?
Override(重寫(xiě))和Overload(重載) 的區(qū)別?
1.重寫(xiě)前提:需要繼承關(guān)系
重載:在同一個(gè)類(lèi)里面實(shí)現(xiàn)
?
2.重寫(xiě):需要方法的聲明完全一致
重載:相同的功能,不同的實(shí)現(xiàn)方式 只跟參數(shù)有關(guān)?
代碼示例?
public class Demo07{
? ? public static void main(String[] args){
? ? ? ? IOS8 ios8 = new IOS8();
? ? ? ? ios8.siri();
?
? ? ? ? //如果直接打印對(duì)象 相當(dāng)于 系統(tǒng)幫你打印時(shí) 調(diào)用 toString()方法
? ? ? ? System.out.println(ios8);? ?//輸出haha
? ? ? ? System.out.println(ios8.toString());? ?//輸出haha
? ? }
}
?
class IOS7{
? ? public void call(){
? ? ? ? System.out.println("打電話");
? ? }
?
? ? public void siri(){
? ? ? ? System.out.println("說(shuō)英文");
? ? }
}
?
class IOS8 extends IOS7{
? ? //方法的重寫(xiě):對(duì)父類(lèi)的方法 進(jìn)行一個(gè)功能上的升級(jí)
? ? //調(diào)不調(diào)父類(lèi)的方法 要根據(jù)實(shí)際情況
? ? public void siri(){
? ? ? ? //中 英文都會(huì)說(shuō)
? ? ? ? super.siri();? ?//調(diào)用父類(lèi)的方法
? ? ? ? System.out.println("會(huì)說(shuō)中文");
? ? }
? ? //重寫(xiě)toString()方法
? ? //利用toString方法 來(lái)寫(xiě)介紹自己的方法
? ? public String toString(){
? ? ? ? return "haha";
? ? }
}?
重寫(xiě)toString()方法介紹?
toString方法是Object類(lèi)中的一個(gè)方法,故所有繼承Object類(lèi)的類(lèi),這些類(lèi)中都有toString方法;
假設(shè)有一個(gè)類(lèi)為Animal,他的一個(gè)對(duì)象為animal,則System.out.println(animal),
打印出來(lái)的是一個(gè)全限定類(lèi)名com.lanou3g.IOS7@33909752,而打印System.out.println(animal.toString),
.lanou3g.IOS7@33909752,即包名+類(lèi)名+@33909752,說(shuō)明打印animal與打印animal.toString()的結(jié)果是一樣的,toString()方法寫(xiě)完整則是
public String toString(){},即說(shuō)明toString方法是有返還值的,即打印animal.t
oString()的結(jié)果,打印的是toString()函數(shù)中return語(yǔ)句返還的值,而打印animal
的結(jié)果又與打印animal.toString()方法的值相同,說(shuō)明打印對(duì)象名所得到的結(jié)果就
是toString中return語(yǔ)句返還的結(jié)果,所有重寫(xiě)Object類(lèi)中得toString方法,改變r(jià)e
turn語(yǔ)句的返還值,然后直接打印對(duì)象名,便可以得到自己想要的結(jié)果.具體結(jié)果如上面代碼所示?
實(shí)例練習(xí)繼承關(guān)系?
需求?
?
老師類(lèi) 學(xué)生類(lèi)??
* 無(wú)參 有參構(gòu)造 set/get方法 成員變量私有化 介紹自己的方法
? 屬性:姓名,年齡
* 行為:吃飯
* 老師有特有的方法:講課
* 學(xué)生有特有的方法:學(xué)習(xí)?
代碼實(shí)現(xiàn)?
package com.lanou3g;
?
?
public class Demo08 {
? ? public static void main(String[] args) {
? ? ? ? //創(chuàng)建一個(gè)學(xué)生
? ? ? ? Student student = new Student("王龍",15,1);
? ? ? ? System.out.println(student);
?
? ? ? ? Teacher teacher = new Teacher("劉",13);
? ? ? ? System.out.println(teacher);
? ? }
}
class Person1{
? ? //屬性
? ? //繼承中private修飾的變量 是不能直接訪問(wèn)的 但可以間接訪問(wèn)的
? ? private String name;
? ? private int age;
? ? //構(gòu)造方法
? ? public Person1() {
?
? ? }
? ? public Person1(String name, int age) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? //set/get方法
? ? 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 eat() {
? ? ? ? System.out.println("吃飯");
? ? }
? ? //介紹自己的方法
? ? @Override
? ? public String toString() {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? return "姓名:" + name + "年齡" + age;
? ? }
?
}
//學(xué)生類(lèi)
class Student extends Person1{
? ? //學(xué)號(hào)
? ? private int num;
?
? ? public int getNum() {
? ? ? ? return num;
? ? }
? ? public void setNum(int num) {
? ? ? ? this.num = num;
? ? }
? ? //構(gòu)造方法
? ? public Student(){
? ? }
? ? //有參
? ? public Student(String name, int age, int num) {
? ? ? ? //直接調(diào)用父類(lèi)的構(gòu)造方法 完成賦值初始化
? ? ? ? //為了保證繼承的完整性 在子類(lèi)構(gòu)造方法中
? ? ? ? //第一行 必須調(diào)用父類(lèi)的構(gòu)造方法(無(wú)參 有參都行)
? ? ? ? super(name,age);
? ? ? ? //特有屬性 直接賦值就行
? ? ? ? this.num = num;
? ? }
? ? public void study() {
? ? ? ? System.out.println("學(xué)生在學(xué)習(xí)");
? ? }
? ? //介紹自己的方法
? ? @Override
? ? public String toString() {
? ? ? ? //可以在父類(lèi)的基礎(chǔ)上 添加自己特有的屬性 去打印
? ? ? ? return super.toString() + "學(xué)號(hào):" + num;
? ? }
}
//教師類(lèi)
class Teacher extends Person1 {
? ? public Teacher(){
?
? ? }
? ? public Teacher(String name, int num) {
? ? ? ? super(name,num);
? ? }
? ? public void teach() {? ? ? ?
? ? ? ? System.out.println("老師會(huì)講課");
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? return super.toString();
? ? }
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的[转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [转载] java中数组的反射的探究
- 下一篇: 用2468这四个数字c语言,C语言作业及