Java学习笔记八
31.
import語(yǔ)句不僅可以導(dǎo)入類,還增加了導(dǎo)入靜態(tài)方法和靜態(tài)域的功能,當(dāng)使用這些方法時(shí)就可以不用加前綴,當(dāng)然,這樣可能不利于程序的清晰度,但是對(duì)于笨重的靜態(tài)方法來(lái)說(shuō)是值得用的,比如說(shuō)
Math類中的方法
package com.jianjian;
?
import static java.lang.Math.*;
?
public class MathTest
{
?? public static void main(String[] args)
?? {
????? double a =pow(4,2);
????? System.out.println(a);
?????
?????
?? }
}
?
32.
包 packager的作用是將生成的類放入包中,
33.
在D:\myclass下面會(huì)生成一個(gè)Welcome.class的文件,接著:
?
開(kāi)始→運(yùn)行→CMD 確定(打開(kāi)DOS窗口)
把路徑換回D:\myclass
(操作如:C:\Documents and Settings\Administrator>E: 回車
E:\cd myclass 回車)
現(xiàn)在輸入:java Welcome 哈哈,看到什么了!!!
?
?
常用的更換路徑的命令: “cd” “cd..”
比如現(xiàn)在有這樣一條路徑:E:\文件夾A\文件夾B\文件夾C
若您現(xiàn)在的位置是C:\Documents and Settings\Administrator>
輸入E: 回車
路徑換為 E:\
輸入“cd 文件夾A”(不要加雙引號(hào))
路徑變?yōu)?E:\文件夾A
再輸入“cd 文件夾B”
路徑變?yōu)?E:\文件夾A\文件夾B (依此類推)
此時(shí)再輸入“cd..”看看,
又變回了 E:\文件夾A
?
所以:cd.. 是退回上級(jí)目錄
?
?
33.
(關(guān)于谷歌輸入法的頓號(hào)修改:屬性設(shè)置——>詞典——>編輯自定義短語(yǔ)——>添加——>“縮寫(xiě)”填“/”,自定義短語(yǔ)填“、”——>一路確定)
?
包作用域:
前面已經(jīng)接觸過(guò)訪問(wèn)修飾符:public 、 private.標(biāo)記為public的部分可以被任意的類使用,標(biāo)記為private的部分只能被定義它們的類使用。如果沒(méi)有指定public、private則可以被同一個(gè)包下的所有方法訪問(wèn)
?
?
?
34.
一般情況下,我們喜歡利用構(gòu)造方法為非共有類賦初值,被副處職的屬性叫做域,其實(shí)我們常常習(xí)慣將域定義為私有,在繼承中,當(dāng)子類想調(diào)用父類中的私有域時(shí),不能直接調(diào)用,只能通過(guò)公有的接口才能實(shí)現(xiàn),接口其實(shí)說(shuō)的就是父類中返回私有域的方法:
35.
在繼承中,子類可以使用父類中的所有域,而不用重新定義這些域,
例如private double salary;存在父類中的花子類就不需要重新定義,如果想加入新的域就要在子類中定義了。
?
?
36.很多的時(shí)候,繼承的使用頻率是很高的,因?yàn)槲覀兛偸菚?huì)遇到像這種情況:要處理的對(duì)象,大多數(shù)是統(tǒng)一的,但是有那么一兩個(gè)是特別的需要額外的改進(jìn)他們,如果數(shù)據(jù)是龐大的,繼承利用數(shù)組實(shí)現(xiàn)數(shù)據(jù)的輸出就更顯得重要!而且由于子類不能訪問(wèn)父類中的私有域,所以輸出時(shí)建議用方法返回私有域,最后的輸出也應(yīng)該通過(guò)方法返回。
看下面的程序。統(tǒng)計(jì)員工 staff 的工資,他分為employee和manager,其中manager的工資加上獎(jiǎng)金bouns。
/*
?* 繼承中還有很多我不知道的東西
?*/
package com.jianjian2;
?
public class StaffTest
{
?? public static void main(String[] args)
?? {
????? Boss boss = new Boss("laoban",5000.0,398.5);//第三個(gè)數(shù)據(jù)是獎(jiǎng)金;
????? Employee[] staff = new Employee[3];//定義三個(gè)數(shù)據(jù)的數(shù)組
????? staff[0] = boss;//向下類型轉(zhuǎn)換
????? staff[1] = new Employee("zhangSan",4534.3);
????? staff[2] = new Employee("liSi",3422.2);
????? for(Employee e : staff)
????? {
??????? System.out.println(e.getName());
??????? System.out.println(e.getSalary());
???????
????? }
?????
?? }
}
class Employee
{
?? private Stringname;
?? private double salary;
?? public Employee(String name,double salary)
?? {
????? this.name = name;
????? this.salary = salary;
?????
?? }
??
?? public String getName()
?? {
????? return name;
?? }
?? public double getSalary()
?? {
????? return salary;
?? }
}
class Boss extends Employee
{
?? public Boss(String name ,double salary,double bouns)
?? {
????? super(name,salary);//這里是個(gè)難點(diǎn),子類調(diào)用父類的構(gòu)造方法,其實(shí)就是要把子類的數(shù)據(jù)完善,即也讓子類具有父類的域;
????? this.bouns = bouns;
?????
?? }
?? private double bouns;
?? public double getSalary()
?? {
?????
????? return bouns + super.getSalary();
?? }
}
?
37.
不允許被繼承的類稱為final類
?
38.
Java里有很多難以理解并且容易忽略的約定,比如說(shuō)抽象類 abstract ;抽象類不能被實(shí)例化,含有抽象方法的類一定是抽象類,抽象類可以有具體的方法,那么什么是抽象方法,抽象方法又有什么意義呢?其實(shí)抽象類既然不能被實(shí)例化,就只能被子類所繼承了,抽象方法在父類中聲明,在子類中實(shí)現(xiàn),一個(gè)難以理解的約定:
如果子類只定義(實(shí)現(xiàn))了父類部分抽象方法,或沒(méi)有定義抽象方法,則子類也必須定義為抽象類,(為了防止子類被實(shí)例化),如果子類實(shí)現(xiàn)了父類中的全部抽象方法(可不是全部方法),子類就不是抽象的了;
?
39.
至于說(shuō)抽象方法的意義:我們只是在父類中聲明一下大概,但是我們并不知道接下來(lái)子類要怎么實(shí)現(xiàn)這個(gè)方法,比如說(shuō),我們?cè)谧宇愔卸x一個(gè)返回對(duì)員工評(píng)價(jià)的方法
Abstract public String evaluate();
然后在子類中重寫(xiě)這個(gè)方法,
public String evaluate()
{
}
有一點(diǎn)必須記住的是上面的約定,加入父類只有真么一個(gè)抽象方法,子類又實(shí)現(xiàn)了他,子類就不是抽象類了;
那么為什么定義抽象方法呢,如果在子類中直接定義評(píng)價(jià)方法不就行了嗎?為什么要什么聲明呢?
定義抽象方法有兩個(gè)好處:
1.?增加程序的結(jié)構(gòu)可讀性;
2.?很常見(jiàn)的,我們可能要同意調(diào)出子類父類中的某一屬性(域);
而我們都知道域大多數(shù)是私有的,或者統(tǒng)一調(diào)用某一方法,比如用
for(…..)
那么我們打印的時(shí)候肯定要用父類來(lái)打,如果父類不存在該方法,或者屬性,子類是無(wú)法打印出的,肯定出錯(cuò),所以抽象方法起著占位的作用。比如說(shuō)我們都在子類中定義了一個(gè)evaluate的方法,當(dāng)想把子類父類中的全部方法打印出來(lái)的時(shí)候,父類一定要有這個(gè)方法才能打印!
?
40.
/*
?* 編寫(xiě)一個(gè)程序?qū)崿F(xiàn):定義三個(gè)員工,分別包含姓名,工資,其中有一名是經(jīng)理,要求經(jīng)理的工資要加上獎(jiǎng)金;
?* 另外要實(shí)現(xiàn)經(jīng)理的一句評(píng)價(jià)
不要陷入一個(gè)誤區(qū),父類不能實(shí)例化,如果只像上面一道題中生成父類對(duì)象將數(shù)據(jù)帶入構(gòu)造方法中顯然是不行的,也就是說(shuō)我們也就只能通過(guò)子類一個(gè)一個(gè)來(lái)寫(xiě)了。這里只寫(xiě)Manager;
?*/
package com.jianjian5;
?
public class AbstractTest
{
?? public static void main(String[] args)
?? {
????? Employee[] staff = new Employee[3];
????? Manager boss = new Manager("wangwu", 3838.2, 334);
????? System.out.println(boss.getEvaluate());
????? System.out.println(boss.getName());
?????
?? }
}
abstract class Employee
{
?? private Stringname;
?? private double salary;
?? public Employee(String name,double salary)
?? {
????? this.name = name;
????? this.salary = salary;
?????
?? }
?? public double getSalary()
?? {
????? return salary;
?????
??????????
?? }
?? public String getName()
?? {
????? return name;
?? }
?? abstract public String getEvaluate();
??
}
class Managerextends Employee
{
?? private double bonus;
?? public Manager(String name ,double salary ,double bonus)
?? {
????? super(name,salary);
????? this.bonus = bonus;
?? }
?? public double getSalary()
?? {
????? return super.getSalary() + bonus;
?? }
?? public String getEvaluate()
?? {
????? return "He isreally a good boss";
?? }
??
}
?
?
41.
可以使用object類型的變量引用任何類型的對(duì)象;
想想會(huì)多有用,忽略類型;
?
42.
從Jdk5.0之后Java中的集合就采用泛型的方式執(zhí)行了,自5.0往集合中添加基本數(shù)據(jù)類型和輸出基本數(shù)據(jù)類型,都有自動(dòng)打包,和拆封的功能,也就是不需要進(jìn)行包裝類了:
比如 list.add(3);
?
43.
集合中運(yùn)用泛型之后,就確定了集合中要加入對(duì)象的類型;
比如說(shuō) List<String> list = new ArrayList<String>();
這樣的話就這能向list中添加字符串類型的數(shù)據(jù)了;
可是這樣做只能添加固定類型,而不能添加其他類型,圖什么呢,其實(shí)就是圖個(gè)方便,在輸出的時(shí)候我們不用再進(jìn)行強(qiáng)制類型轉(zhuǎn)換了,
以前再?zèng)]有使用泛型的時(shí)候都是默認(rèn)Object類型的.
通常我們一個(gè)集合也就存放相同的對(duì)象,所以這個(gè)缺點(diǎn)是可以容忍的。
?
?
44.幾乎所有集合都是有泛型要求的,所以對(duì)于遍歷集合泛型的類
Interator 也接受泛型 ,看下面的程序:
?
package com.jianjian;
?
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
?
public class GenericTest
{
?? public static void main(String[] args)
?? {
????? ArrayList <String> list = new ArrayList<String>();
????? String[] a = new String[3];
????? list.add("a");
????? list.add("b");
????? list.add("c");
????? list.toArray(a);//這里是轉(zhuǎn)換數(shù)組
????? System.out.println(Arrays.toString(a));
????? for(Iterator<String> ite =list.iterator();ite.hasNext();)
????? {
??????? String s = ite.next();
??????? System.out.println(s);
????? }
}
?? }
??
?
由于沒(méi)有了強(qiáng)制類型轉(zhuǎn)換,整個(gè)代碼顯得整潔多了。
剛接觸泛型,就多舉幾個(gè)例子,再?gòu)?fù)習(xí)一下知識(shí),當(dāng)想把自定義的類中的數(shù)據(jù)加到集合中時(shí),我們要判斷要加入的數(shù)據(jù)是不是已經(jīng)存在了,所以要調(diào)用 equals 和hashcode方法,注意要仔細(xì)研讀西面的程序,設(shè)置get 和 set 方法的原因就是提供一個(gè)公共的接口,要知道私有域只能通過(guò)共有方法來(lái)調(diào)取的:
package com.jianjian2;
?
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
?
public class GenericSetTest
{
?? public static void main(String[] args)
?? {
????? Set<Staff> set = new HashSet<Staff>();
????? set.add(new Staff("zhangsan", 23,"BeiJing"));
????? set.add(new Staff("lisi",21,"TianJing"));
????? set.add(new Staff("wangwu",24,"XiBanYa"));
????? for(Iterator<Staff> ite = set.iterator();ite.hasNext();)
????? {
??????? Staff staff = ite.next();
??????? String s1 = staff.getName();
??????? int s2 = staff.getAge();
??????? String s3 = staff.getAddress();
??????? System.out.println("name:" + s1 +", age:"+s2+", address: "+s3);
????? }
?????
?????
?? }
}
class Staff
{
?? private Stringname;
?? private int age;
?? private Stringaddress;
?? public Staff(String name,int age, String address)
?? {
????? this.name = name;
????? this.age = age;
????? this.address = address;
?????
?? }
?? 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;
?? }
?? @Override
?? public int hashCode()
?? {
????? final int prime = 31;
????? int result = 1;
????? result = prime * result + ((address ==null) ? 0 :address.hashCode());
????? result = prime * result + age;
????? result = prime * result + ((name ==null) ? 0 :name.hashCode());
????? return result;
?? }
?? @Override
?? public boolean equals(Object obj)
?? {
????? if (this == obj)
??????? return true;
????? if (obj ==null)
??????? return false;
????? if (getClass() != obj.getClass())
??????? return false;
????? Staff other = (Staff) obj;
????? if (address ==null)
????? {
??????? if (other.address !=null)
?????????? return false;
????? }
????? else if (!address.equals(other.address))
??????? return false;
????? if (age != other.age)
??????? return false;
????? if (name ==null)
????? {
??????? if (other.name !=null)
?????????? return false;
????? }
????? else if (!name.equals(other.name))
??????? return false;
????? return true;
?? }
?? public String getAddress()
?? {
????? return address;
?? }
?? public void setAddress(String address)
?? {
????? this.address = address;
?? }
??
}
?
?
總結(jié)