繼承的概念
繼承是面向?qū)ο笞铒@著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為崇决,并能擴展新的能力。
在Java之中抵赢,如果要實現(xiàn)繼承的關(guān)系,可以使用如下的語法:
class 子類 extends 父類 {}
子類又被稱為派生類; 父類又被稱為超類。
觀察繼承的基本實現(xiàn):
package com.wz.extendsdemo;
class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
}
class Student extends Person { // Student類繼承了Person類
}
public class TestDemo {
public static void main(String args[]) {
Student stu = new Student(); // 實例化的是子類
stu.setName("張三"); // Person類定義
stu.setAge(20); // Person類定義
System.out.println("姓名:" + stu.getName() + "吕粗,年齡:" + stu.getAge());
}
}
運行結(jié)果:
姓名:張三,年齡:20
通過代碼可以發(fā)現(xiàn)旭愧,子類(Student)并沒有定義任何的操作颅筋,而在主類中所使用的全部操作都是由Person類定義的虐秋,這證明:子類即使不擴充父類,也能維持父類的操作垃沦。
在子類之中擴充父類的功能:
package com.wz.extendsdemo;
class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
}
class Student extends Person { // Student類繼承了Person類
private String school; // 子類的屬性
public void setSchool(String school) {
this.school = school;
}
public String getSchool() {
return this.school;
}
}
public class TestDemo {
public static void main(String args[]) {
Student stu = new Student(); // 實例化的是子類
stu.setName("張三"); // Person類定義
stu.setAge(20); // Person類定義
stu.setSchool("清華大學(xué)"); // Student類擴充方法
System.out.println("姓名:" + stu.getName() + ",年齡:" + stu.getAge() + "用押,學(xué)校:" + stu.getSchool());
}
}
運行結(jié)果:
姓名:張三肢簿,年齡:20,學(xué)校:清華大學(xué)
object:所有類的超類
object類是所有類的超類蜻拨,所有的類都是由object類擴展而來
但是沒有必要可以的去用類繼承object類池充。
可以用object類引用任何類型的對象
Object a =new Test();
只有八種基本類型不是Object類型擴展而來的(bit short int long char float double boolean ),其他的都是類類型缎讼,也都是由Object擴
展而來收夸。包括對象,數(shù)組等血崭。
object也有很多方法卧惜,tostring,equals夹纫,getclass等咽瓷。
其中類也重寫了Object方法。其中的getclass的方法可以用來反射舰讹。
泛型數(shù)組列表
在java中,不能通過直接通過T[] tarr=new T[10]的方式來創(chuàng)建數(shù)組,最簡單的方式便是通過Array.newInstance(Class<t>type,int size)的方式來創(chuàng)建數(shù)組
泛型有三種使用方式茅姜,分別為:泛型類、泛型接口月匣、泛型方法
泛型類型用于類的定義中钻洒,被稱為泛型類。通過泛型可以完成對一組類的操作對外開放相同的接口锄开。最典型的就是各種容器類素标,如:List、Set院刁、Map
對象包裝器與自動打包
所有基本類型都有一個與之對應(yīng)的類糯钙,例如,Integer類對應(yīng)基本類型int退腥。通常任岸,這些類稱為包裝器(wrapping)。這些對象包裝器擁有很鮮明的名字:Integer狡刘、Long享潜、Float、Double嗅蔬、Short剑按、Byte疾就、Character、Void和Boolean(前面六個類派生于公共的超類Number)艺蝴。對象包裝器類是不可變的猬腰,一旦構(gòu)造了包裝器,就不允許更改包裝器里面的值猜敢。同時姑荷,對象包裝器還是final,因此不能定義他們的子類缩擂。
定義一個整形數(shù)組列表鼠冕,尖括號里面的參數(shù)類型不允許是基本類型,也就是說不允許寫成ArrayList<int>胯盯。這里就用到了Integer對象包裝器類懈费。我們可以聲明一個Integer對象的數(shù)組列表。
ArrayList<Integer> list = new ArrayList<Integer>;
當調(diào)用:
list.add(3);
將自動變換成:
list.add(new Integer(3));
這種變換稱之自動打包(autoboxing)博脑。
相反的如果將Integer對象賦值給一個int值時憎乙,將會自動第拆包。也就是說編譯器將下列語句:
int n = list.get(i);
翻譯成:
int n = list.get(i).intValue();
甚至在算術(shù)表達式中也能夠自動的打包和拆包趋厉。例如寨闹,可以將自增操作符應(yīng)用于一個包裝器引用
Integer n = 3;
n++;
編譯器將自動第插入一條拆開對象包的指令,然后進行自增運算君账,最后再將結(jié)果打入對象包內(nèi)繁堡。
很多情況下,容易有一種假象乡数,即基本類型和他們的對象包裝類是一樣的椭蹄,只是他們的相等性不同,==運算符也可以用于包裝器對象净赴,只不過檢測的是對象是否指向同一個存儲區(qū)域绳矩。
參數(shù)數(shù)量可變的方法
可變參數(shù):適用于參數(shù)個數(shù)不確定,類型確定的情況玖翅,java把可變參數(shù)當做數(shù)組處理翼馆。
注意:可變參數(shù)必須位于最后一項。
原因:當可變參數(shù)個數(shù)多余一個時金度,必將有一個不是最后一項应媚,所以只支持有一個可變參數(shù)。因為參數(shù)個數(shù)不定猜极,所以當其后邊還有相同類型參數(shù)時中姜,java無法區(qū)分傳入的參數(shù)屬于前一個可變參數(shù)還是后邊的參數(shù),所以只能讓可變參數(shù)位于最后一項跟伏。
枚舉類
有的時候一個類的對象是有限且固定的丢胚,這種情況下我們使用枚舉類
枚舉類更加直觀翩瓜,類型安全。使用常量會有以下幾個缺陷:
1. 類型不安全携龟。若一個方法中要求傳入季節(jié)這個參數(shù)兔跌,用常量的話,形參就是int類型峡蟋,開發(fā)者傳入任意類型的int類型值就行浮定,但是如果是枚舉類型的話,就只能傳入枚舉類中包含的對象层亿。
2. 沒有命名空間。開發(fā)者要在命名的時候以SEASON_開頭立美,這樣另外一個開發(fā)者再看這段代碼的時候匿又,才知道這四個常量分別代表季節(jié)。
先看一個簡單的枚舉類建蹄。
package enumcase;
public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
反射
Java反射就是在運行狀態(tài)中碌更,對于任意一個類,都能夠知道這個類的所有屬性和方法洞慎;對于任意一個對象痛单,都能夠調(diào)用它的任意方法和屬性;并且能改變它的屬性劲腿。
下面是一個基本的類 Person
package com.ys.reflex;
public class Person {
//私有屬性
private String name = "Tom";
//公有屬性
public int age = 18;
//構(gòu)造方法
public Person() {
}
//私有方法
private void say(){
System.out.println("private say()...");
}
//公有方法
public void work(){
System.out.println("public work()...");
}
}