Java 繼承
所有Java的類均是由java.lang.Object類繼承而來的埂奈,所以O(shè)bject是所有類的祖先類铅祸,而除了Object外嗦玖,所有類必須有一個(gè)父類乒验。java只支持單繼承愚隧,多繼承用接口來實(shí)現(xiàn)。python支持多繼承
extends關(guān)鍵字:通過使用關(guān)鍵字extends锻全,子類可以繼承父類的除private屬性外所有的屬性。
通過使用instanceof
操作符录煤,能夠確定子類是不是一個(gè)父類
Implements關(guān)鍵字:使用在類繼承接口的情況下鳄厌, 這種情況不能使用關(guān)鍵字extends
Java 重寫
重寫是子類對(duì)父類的允許訪問的方法的實(shí)現(xiàn)過程進(jìn)行重新編寫!返回值和形參都不能改變妈踊。即外殼不變了嚎,核心重寫。重寫的好處在于子類可以根據(jù)需要廊营,定義特定于自己的行為歪泳。也就是說子類能夠根據(jù)需要實(shí)現(xiàn)父類的方法。
class Animal{
public void move(){
System.out.println("動(dòng)物可以移動(dòng)");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 對(duì)象
Animal b = new Dog(); // Dog 對(duì)象
a.move();// 執(zhí)行 Animal 類的方法
b.move();//執(zhí)行 Dog 類的方法
}
}
子類中重寫了父類的方法后又想再調(diào)用父類的這個(gè)方法露筒,用super關(guān)鍵字
Java 重載
重載(overloading) 是在一個(gè)類里面呐伞,方法名字相同,而參數(shù)不同慎式。返回類型呢伶氢?可以相同也可以不同。每個(gè)重載的方法(或者構(gòu)造函數(shù))都必須有一個(gè)獨(dú)一無二的參數(shù)類型列表瘪吏。
class Numers{
public Numers(){
}
public void count(int a,int b){
System.out.println("there are two numers");
}
public void count(int a){
System.out.println("there is one number");
}
}
public class JichenTest {
public static void main(String args[])
{
Numers aNumers = new Numers();
aNumers.count(1,2);
aNumers.count(1);
}
}
output:
there are two numers
there is one number
重寫與重載之間的區(qū)別
區(qū)別點(diǎn) | 重載方法 | 重寫方法 |
---|---|---|
參數(shù)列表 | 必須修改 | 一定不能修改 |
返回類型 | 可以修改 | 一定不能修改 |
異常 | 可以修改 | 可以減少或刪除癣防,一定不能拋出新的或者更廣的異常 |
訪問 | 可以修改 | 一定不能做更嚴(yán)格的限制(可以降低限制 |
Java 多態(tài)
多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。多態(tài)性是對(duì)象多種表現(xiàn)形式的體現(xiàn)掌眠。
public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}
因?yàn)镈eer類具有多重繼承蕾盯,所以它具有多態(tài)性。以上實(shí)例解析如下:
- 一個(gè) Deer IS-A(是一個(gè)) Animal
- 一個(gè) Deer IS-A(是一個(gè)) Vegetarian
- 一個(gè) Deer IS-A(是一個(gè)) Deer
- 一個(gè) Deer IS-A(是一個(gè))Object
虛方法
class Employee{
String name;
public Employee(String name){
this.name =name;
}
public void check(){
System.out.println("this is an Employee class");
}
}
class Salary extends Employee{
public Salary(String name){
super(name);
}
public void check(){
System.out.println("this s salary class");
}
}
public class Xuways {
public static void main(String args[]){
Salary asalary = new Salary("salarytest");
Employee aEmployee = new Salary("employeetest");
asalary.check();
aEmployee.check();
}
}
雖然 aEmployee用的是Employee的引用蓝丙,但是但new 的是salary類型级遭, 編譯的時(shí)候望拖,編譯器使用Employee中check()方法驗(yàn)證該語句,但是在運(yùn)行的時(shí)候装畅,java虛擬機(jī)調(diào)用的Salaryde 的check( )方法
Java 抽象類
抽象類:
在面向?qū)ο蟮母拍钪锌坑椋械膶?duì)象都是通過類來描繪的,但是反過來掠兄,并不是所有的類都是用來描繪對(duì)象的像云,如果一個(gè)類中沒有包含足夠的信息來描繪一個(gè)具體的對(duì)象,這樣的類就是抽象類蚂夕。
抽象類除了不能實(shí)例化對(duì)象之外迅诬,類的其它功能依然存在,成員變量婿牍、成員方法和構(gòu)造方法的訪問方式和普通類一樣侈贷。
由于抽象類不能直接實(shí)例化對(duì)象,所以抽象類必須被繼承等脂,才能被使用俏蛮。也是因?yàn)檫@個(gè)原因,通常在設(shè)計(jì)階段決定要不要設(shè)計(jì)抽象類上遥。父類包含了子類集合的常見的方法搏屑,但是由于父類本身是抽象的,所以不能使用這些方法粉楚。
抽象方法
如果你想設(shè)計(jì)這樣一個(gè)類辣恋,該類包含一個(gè)特別的成員方法,該方法的具體實(shí)現(xiàn)由它的子類確定模软,那么你可以在父類中聲明該方法為抽象方法伟骨。
Abstract關(guān)鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個(gè)方法名燃异,而沒有方法體携狭。
抽象方法沒有定義,方法名后面直接跟一個(gè)分號(hào)特铝,而不是花括號(hào)暑中。
public abstract class Employee
{
private String name;
private String address;
private int number;
public abstract double computePay();
//其余代碼
}
如果一個(gè)類包含了抽象方法,那么該類必須是抽象類
繼承抽象方法的子類必須重寫父類的抽象方法鲫剿,否則該子類也必須聲明為抽象類
Java 封裝
一個(gè)類中定義的變量為了不讓外部隨意訪問和修改鳄逾,一般都會(huì)對(duì)該變量設(shè)置get和set方法,稱之為封裝
Java 接口
是個(gè)抽象類型灵莲,是抽象方法的集合雕凹,通常用interface來聲明。一個(gè)類通過繼承接口的方式來繼承接口的抽象方法。接口無法被實(shí)例化枚抵,但可以被實(shí)現(xiàn)线欲。接口的類型和其中包含的方法都是抽象的,默認(rèn)是abstract汽摹,這個(gè)關(guān)鍵字可省略李丰。
接口并不是類,編寫接口的方式和類很相似逼泣,但是它們屬于不同的概念趴泌。類描述對(duì)象的屬性和方法。接口則包含類要實(shí)現(xiàn)的方法拉庶。
除非實(shí)現(xiàn)接口的類是抽象類嗜憔,否則該類要定義接口中的所有方法。
interface Animalactions{
public void move();
public void bark();
}
class Animal implements Animalactions{
public void move(){
System.out.println("this is move");
}
public void bark(){
System.out.println("this is bark");
}
}
public class InterfaceTest {
public InterfaceTest(){
}
public static void main(String args[]){
Animal aanimal = new Animal();
aanimal.bark();
System.out.println(aanimal instanceof Animalactions);
}
}
output:
this is bark
true
接口的繼承:一個(gè)接口繼承另一個(gè)接口氏仗,可以多繼承吉捶,用關(guān)鍵字extend
標(biāo)記接口:沒有任何方法的接口被稱為標(biāo)記接口
Java包
為了更好地組織類,Java提供了包機(jī)制皆尔,用于區(qū)別類名的命名空間
包的作用:
- 1 把功能相似或相關(guān)的類或接口組織在同一個(gè)包中呐舔,方便類的查找和使用。
- 2 如同文件夾一樣慷蠕,包也采用了樹形目錄的存儲(chǔ)方式滋早。同一個(gè)包中的類名字是不同的,不同的包中的類的名字是可以相同的砌们,當(dāng)同時(shí)調(diào)用兩個(gè)不同包中相同類名的類時(shí),應(yīng)該加上包名加以區(qū)別搁进。因此浪感,包可以避免名字沖突。
- 3 包也限定了訪問權(quán)限饼问,擁有包訪問權(quán)限的類才能訪問某個(gè)包中的類影兽。
如果調(diào)用的類不在包中,就要使用全名(xxpackage.xx)或者導(dǎo)入該class(import xxpackage.xxx)