標(biāo)識(shí)符
什么是標(biāo)識(shí)符
就是程序員在定義java程序時(shí),自定義的一些名字,例如helloworld 程序里關(guān)鍵字class 后跟的Demo,就是我們定義的類名。類名就屬于標(biāo)識(shí)符的一種。標(biāo)識(shí)符除了應(yīng)用在類名上,還可以用在變量、函數(shù)名、包名上-
標(biāo)識(shí)符必須遵循以下規(guī)則
- 標(biāo)識(shí)符由26個(gè)英文字符大小寫(azAZ)、數(shù)字(0~9)、下劃線(_)和美元符號(hào)($)組成。
- 不能以數(shù)字開(kāi)頭,不能是關(guān)鍵字
- 嚴(yán)格區(qū)分大小寫
- 標(biāo)識(shí)符的可以為任意長(zhǎng)度
this關(guān)鍵字
- this關(guān)鍵字代表了所屬函數(shù)的調(diào)用者對(duì)象
- this關(guān)鍵字作用
- 如果存在同名成員變量與局部變量時(shí), 在方法內(nèi)部默認(rèn)是訪問(wèn)局部變量的數(shù)據(jù), 可以通過(guò)this關(guān)鍵字指定訪問(wèn)成員變量的數(shù)據(jù)
- 在一個(gè)構(gòu)造函數(shù)中可以調(diào)用另外一個(gè)構(gòu)造函數(shù)初始化對(duì)象
- this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)要注意的事項(xiàng)
- this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)時(shí), this關(guān)鍵字必須要位于構(gòu)造函數(shù)中的第一個(gè)語(yǔ)句
- this關(guān)鍵字在構(gòu)造函數(shù)中不能出現(xiàn)相互調(diào)用的情況, 因?yàn)槭且粋€(gè)死循環(huán)
- this關(guān)鍵字要注意事項(xiàng)
- 存在同名的成員變量與局部變量時(shí), 在方法的內(nèi)部訪問(wèn)的是局部變量(java 采取的是“就近原則”的機(jī)制訪問(wèn)的)
- 如果在一個(gè)方法中訪問(wèn)了一個(gè)變量, 該變量只存在成員變量的情況下, 那么java編譯器會(huì)在該變量的前面添加this關(guān)鍵字
- this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)要注意的事項(xiàng):
- this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)時(shí), this關(guān)鍵字必須要位于構(gòu)造函數(shù)中的第一個(gè)語(yǔ)句
- this關(guān)鍵字在構(gòu)造函數(shù)中不能出現(xiàn)相互調(diào)用 的情況, 因?yàn)槭且粋€(gè)死循環(huán)
class Student{
int id; //身份證
String name; //名字
//目前情況:存在同名 的成員 變量與局部變量,在方法內(nèi)部默認(rèn)是使用局部變量的。
public Student(int id,String name){ //一個(gè)函數(shù)的形式參數(shù)也是屬于局部變量。
this(name); //調(diào)用了本類的一個(gè)參數(shù)的構(gòu)造方法
//this(); //調(diào)用了本類無(wú)參的構(gòu)造方法。
this.id = id; // this.id = id 局部變量的id給成員變量的id賦值
System.out.println("兩個(gè)參數(shù)的構(gòu)造方法被調(diào)用了...");
}
public Student(){
System.out.println("無(wú)參的構(gòu)造方法被調(diào)用了...");
}
public Student(String name){
this.name = name;
System.out.println("一個(gè)參數(shù)的構(gòu)造方法被調(diào)用了...");
}
}
class Demo
{
public static void main(String[] args)
{
Student s = new Student(110, "鐵蛋");
System.out.println("編號(hào):"+ s.id +" 名字:" + s.name);
/*
Student s2 = new Student("金胖子");
System.out.println("名字:" + s2.name);
*/
}
}
static(靜態(tài))
-
static(靜態(tài)\修飾符) : 靜態(tài)的成員變量只會(huì)在數(shù)據(jù)共享區(qū)中維護(hù)一份,而非靜態(tài)成員變量的數(shù)據(jù)會(huì)在每個(gè)對(duì)象中都維護(hù)一份的
- static修飾成員變量 : 如果有數(shù)據(jù)需要被共享給所有對(duì)象使用時(shí), 那么就可以使用static修飾
- 靜態(tài)成員變量的訪問(wèn)方式:
- 方式1 : 可以使用對(duì)象進(jìn)行訪問(wèn)
格式 : 對(duì)象.變量名
- 方式二 : 可以使用類名進(jìn)行訪問(wèn)
格式 : 類名.變量名 - 注意 :
1. 非靜態(tài)的成員變量只能使用對(duì)象進(jìn)行訪問(wèn),不能使用類名進(jìn)行訪問(wèn)。
2. 千萬(wàn)不要為了方便訪問(wèn)數(shù)據(jù)而使用static修飾成員變量,只有成員變量的數(shù)據(jù)是真正需要被共享的時(shí)候才使用static修飾。 - static修飾成員變量的應(yīng)用場(chǎng)景 : 如果一個(gè)數(shù)據(jù)需要被所有對(duì)象共享使用的時(shí)候,這時(shí)候即可好實(shí)用static修飾
- static修飾成員函數(shù) : (靜態(tài)函數(shù))
-
訪問(wèn)方式:
方式一:可以使用對(duì)象進(jìn)行訪問(wèn)。
對(duì)象.靜態(tài)的函數(shù)名()
方式二:可以使用類名進(jìn)行訪問(wèn)。
類名.靜態(tài)函數(shù)名字。推薦使用是類名直接訪問(wèn)靜態(tài)的成員。 -
靜態(tài)的成員變量與非靜態(tài)的成員變量的區(qū)別:
- 作用上的區(qū)別:
1. 靜態(tài)的成員變量的作用共享一個(gè) 數(shù)據(jù)給所有的對(duì)象使用。
2. 非 靜態(tài)的成員變量的作用是描述一類事物的公共屬性。 - 數(shù)量與存儲(chǔ)位置上的區(qū)別:
1. 靜態(tài)成員變量是存儲(chǔ)方法 區(qū)內(nèi)存中,而且只會(huì)存在一份數(shù)據(jù)。
2. 非靜態(tài)的成員變量是存儲(chǔ)在堆內(nèi)存中,有n個(gè)對(duì)象就有n份數(shù)據(jù)。 - 生命周期的區(qū)別:
1. 靜態(tài)的成員變量數(shù)據(jù)是隨著類的加載而存在, 隨著類文件的消失而消失
2.非靜態(tài)的成員數(shù)據(jù)是隨著對(duì)象的創(chuàng)建而存在, 隨著對(duì)象被垃圾回收器回收而消失。
- 作用上的區(qū)別:
-
靜態(tài)函數(shù)要注意的事項(xiàng):
- 靜態(tài)函數(shù)是可以調(diào)用類名或者對(duì)象進(jìn)行調(diào)用的,而非靜態(tài)函數(shù)只能使用對(duì)象進(jìn)行調(diào)用。
- 靜態(tài)的函數(shù)可以直接訪問(wèn)靜態(tài)的成員,但是不能直接訪問(wèn)非靜態(tài)的成員。
原因 : 靜態(tài)函數(shù)是可以使用類名直接調(diào)用的, 這時(shí)候可能還沒(méi)有存在對(duì)象, 而非靜態(tài)的成員數(shù)據(jù)是隨著對(duì)象的存在而存在的 - 非靜態(tài)的函數(shù)是可以直接訪問(wèn)靜態(tài)與非靜態(tài)的成員
原因 : 非靜態(tài)函數(shù)只能由對(duì)象調(diào)用, 當(dāng)對(duì)象存在的時(shí)候, 靜態(tài)數(shù)據(jù)老早就已經(jīng)存在了, 而非靜態(tài)數(shù)據(jù)也隨著對(duì)象的創(chuàng)建而存在了 - 靜態(tài)函數(shù)不能出現(xiàn)this或者super關(guān)鍵字。
原因 : 因?yàn)殪o態(tài)的函數(shù)是可以使用類名調(diào)用的, 一旦使用類名調(diào)用這時(shí)候不存在對(duì)象, 而this關(guān)鍵字是代表了一個(gè)函數(shù) 的調(diào)用者對(duì)象, 這時(shí)候產(chǎn)生了沖突
靜態(tài)的數(shù)據(jù)的生命周期:靜態(tài)的成員變量數(shù)據(jù)是優(yōu)先于對(duì)象存在的
static什么時(shí)候修飾一個(gè)函數(shù)?
如果一個(gè)函數(shù)沒(méi)有直接訪問(wèn)到非靜態(tài)的成員時(shí),那么就可以使用static修飾了(一般用于工具類型的方法)靜態(tài)函數(shù)不能訪問(wèn)非靜態(tài)的成員?
靜態(tài)函數(shù)只要存在有對(duì)象, 那么也可以訪問(wèn)非靜態(tài)的數(shù)據(jù), 只是不能直接訪問(wèn)而已
super關(guān)鍵字
super關(guān)鍵字代表了父類空間的引用
-
super關(guān)鍵字的作用 :
- 子父類存在著同名的成員時(shí),在子類中默認(rèn)是訪問(wèn)子類的成員,可以通過(guò)super關(guān)鍵字指定訪問(wèn)父類的成員
- 創(chuàng)建子類對(duì)象時(shí),默認(rèn)會(huì)先調(diào)用父類無(wú)參的構(gòu)造方法,可以通過(guò)super關(guān)鍵字指定調(diào)用父類的構(gòu)造方法
-
super關(guān)鍵字調(diào)用父類構(gòu)造方法要注意的事項(xiàng):
- 如果在子類的構(gòu)造方法上沒(méi)有指定調(diào)用父類的構(gòu)造方法,那么java編譯器會(huì)在子類的構(gòu)造方法上面加上super()語(yǔ)句
- super關(guān)鍵字調(diào)用父類的構(gòu)造函數(shù)時(shí),該語(yǔ)句必須要是子類構(gòu)造函數(shù)中的第一個(gè)語(yǔ)句
- super與this關(guān)鍵字不能同時(shí)出現(xiàn)在同一個(gè)構(gòu)造函數(shù)中調(diào)用其他的構(gòu)造函數(shù)。因?yàn)閮蓚€(gè)語(yǔ)句都需要第一個(gè)語(yǔ)句
-
super關(guān)鍵字與this關(guān)鍵字的區(qū)別:
- 代表的事物不一致
1. super關(guān)鍵字代表的是父類空間的引用
2. this關(guān)鍵字代表的是所屬函數(shù)的調(diào)用者對(duì)象 - 使用前提不一致
1. super關(guān)鍵字必須要有繼承關(guān)系才能使用
2. this關(guān)鍵字不需要存在繼承關(guān)系也可使用 - 調(diào)用構(gòu)造函數(shù)的區(qū)別 :
1. super關(guān)鍵字是調(diào)用父類的構(gòu)造函數(shù)
2. this關(guān)鍵字是調(diào)用本類的構(gòu)造函數(shù)
- 代表的事物不一致
instanceof 關(guān)鍵字
- instanceof關(guān)鍵字的作用:判斷一個(gè)對(duì)象是否屬于指定的類別。
- instanceof關(guān)鍵字的使用前提:判斷的對(duì)象與指定的類別必須要存在繼承或者實(shí)現(xiàn)的關(guān)系(學(xué)習(xí)接口的時(shí)候就會(huì)理解)
- instanceof關(guān)鍵字的使用格式:
對(duì)象 instanceof 類別 - instanceof關(guān)鍵字的作用:一般做強(qiáng)制類型轉(zhuǎn)換之前都會(huì)使用該關(guān)鍵字先判斷一下,然后在進(jìn)行轉(zhuǎn)換
final(最終、修飾符)
- final關(guān)鍵字的用法:
- final關(guān)鍵字修飾一個(gè)基本類型的變量時(shí),該變量不能重新賦值,第一次的值為最終的
- fianl關(guān)鍵字修飾一個(gè)引用類型變量時(shí),該變量不能重新指向新的對(duì)象
- final關(guān)鍵字修飾一個(gè)函數(shù)的時(shí)候,該函數(shù)不能被重寫
- final關(guān)鍵字修飾一個(gè)類的時(shí)候,該類不能被繼承
- 常量 的修飾符一般為: public static final
//圓形
class Circle{
double r; //半徑
public static final double pi = 3.14; //固定不變的
public Circle(double r){
this.r = r;
}
//計(jì)算面積
public final void getArea(){
System.out.println("圓形的面積是:"+r*r*pi);
}
}
class Demo2 extends Circle
{
public Demo2(double r){
super(r);
}
public static void main(String[] args)
{
/*
final Circle c = new Circle(4.0);
test(c);
*/
Demo2 c = new Demo2(4.0);
c.getArea();
}
public static void test(Circle c){
c = new Circle(5.0); //c變量又重新指向了新的對(duì)象。
c.getArea();
}
}
抽象類 : abstract
-
抽象類的應(yīng)用場(chǎng)景:
- 我們?cè)诿枋鲆活愂挛锏臅r(shí)候,發(fā)現(xiàn)該種事物確實(shí)存在著某種行為, 但是這種行為目前是不具體的,那么我們可以抽取這種行為 的聲明,但是不去實(shí)現(xiàn)該種行為,這時(shí)候這種行為我們稱作為抽象的行為,我們就需要使用抽象類
- 目前存在的問(wèn)題:
- 動(dòng)物類的run方法描述的不正確
- 沒(méi)有強(qiáng)制要子類一定要重寫run方法
抽象類的好處: 強(qiáng)制要求子類一定要實(shí)現(xiàn)指定的方法。
-
抽象類要注意的細(xì)節(jié) :
- 如果一個(gè)函數(shù)沒(méi)有方法體, 那么該函數(shù)必須要使用abstract修飾把函數(shù)修飾成抽象的函數(shù)
- 如果一個(gè)類出現(xiàn)了抽象的函數(shù),那么該類也必須使用abstract修飾
- 如果一個(gè)非抽象類繼承了抽象類, 那么必須要把抽象類的所有抽象方法全部實(shí)現(xiàn)
- 抽象類可以存在非抽象方法, 也可以存在抽象的方法
- 抽象類可以不存在抽象方法的
- 抽象類是不能創(chuàng)建對(duì)象的
疑問(wèn):為什么抽象類不能創(chuàng)建對(duì)象呢?
因?yàn)槌橄箢愂谴嬖诔橄蠓椒ǖ?,如果能讓抽象類?chuàng)建對(duì)象的話,那么使用抽象的對(duì)象調(diào)用抽象方法是沒(méi)有任何意義的 - 抽象類是存在構(gòu)造函數(shù)的,其構(gòu)造函數(shù)是提供給子類創(chuàng)建對(duì)象的時(shí)候初始化父類的屬性的
-
abstract不能與以下關(guān)鍵字共同修飾一個(gè)方法:
- abstract不能與private共同修飾一個(gè)方法
- abstract 不能與static共同修飾一個(gè)方法
- abstract 不能與final共同修飾一個(gè)方法
//動(dòng)物類--->抽象類
abstract class Animal{
String name;
String color;
public Animal(String name,String color){
this.name = name;
this.color = color;
}
//非抽象的方法
public void eat(){
System.out.println(name+"吃糧食");
}
//移動(dòng)...(該函數(shù)沒(méi)有方法體, 所以必須使用abstract修飾該函數(shù))
public abstract void run();
}
//狗 是屬于動(dòng)物中一種
class Dog extends Animal{
public Dog(String name,String color){
super(name,color);
}
public void run(){
System.out.println(name+"四條腿跑得很快...");
}
}
//魚 是屬于動(dòng)物中一種
class Fish extends Animal{
public Fish(String name,String color){
super(name,color);
}
public void run(){
System.out.println(name+"搖搖尾巴游啊游!");
}
}
class Demo{
public static void main(String[] args)
{
/*
Dog d = new Dog("牧羊犬","棕色");
d.run();
//創(chuàng)建一個(gè)魚對(duì)象
Fish f = new Fish("錦鯉","金黃色");
f.run();
*/
Animal a = new Animal();
}
}
- 常量的命名規(guī)范:全部字母大寫,單詞與單詞之間使用下劃線分隔
配置文件類
- Properties(配置文件類): 主要用于生產(chǎn)配置文件與讀取配置文件的信息。
- Properties要注意的細(xì)節(jié):
- 如果配置文件的信息一旦使用了中文,那么在使用store方法生成配置文件的時(shí)候只能使用字符流解決,如果使用字節(jié)流生成配置文件的話,默認(rèn)使用的是iso8859-1碼表進(jìn)行編碼存儲(chǔ),這時(shí)候會(huì)出現(xiàn)亂碼。
- 如果Properties中的內(nèi)容發(fā)生了變化,一定要重新使用Properties生成配置文件,否則配置文件信息不會(huì)發(fā)生變化。
public class Demo{
public static void main(String[] args) throws IOException {
creatProperties();
// readProperties();
}
//讀取配置文件愛(ài)你的信息
public static void readProperties() throws IOException{
//創(chuàng)建Properties對(duì)象
Properties properties = new Properties();
//加載配置文件信息到Properties中
properties.load(new FileReader("F:\\persons.properties"));
//遍歷
Set<Entry<Object, Object>> entrys = properties.entrySet();
for(Entry<Object, Object> entry :entrys){
System.out.println("鍵:"+ entry.getKey() +" 值:"+ entry.getValue());
}
//修改狗娃的密碼
//把修改后的Properties再生成一個(gè)配置文件
properties.setProperty("狗娃", "007");
properties.store(new FileWriter("F:\\persons.properties"), "hehe");
}
//保存配置文件文件的信息
public static void creatProperties() throws IOException{
//創(chuàng)建Properties
Properties properties = new Properties();
properties.setProperty("狗娃", "123");
properties.setProperty("狗剩","234");
properties.setProperty("鐵蛋","345");
// 遍歷Properties
/*Set<Entry<Object, Object>> entrys = properties.entrySet();
for(Entry<Object, Object> entry :entrys){
System.out.println("鍵:"+ entry.getKey() +" 值:"+ entry.getValue());
}*/
//使用Properties生產(chǎn)配置文件。
//properties.store(new FileOutputStream("F:\\persons.properties"), "haha"); //第一個(gè)參數(shù)是一個(gè)輸出流對(duì)象,第二參數(shù)是使用一個(gè)字符串描述這個(gè)配置文件的信息。
properties.store(new FileWriter("F:\\persons.properties"), "hehe");
}
}
需求: 使用properties實(shí)現(xiàn)本軟件只能運(yùn)行三次,超過(guò)了三次之后就提示購(gòu)買正版,退jvm.
public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("F:\\count.properties");
if(!file.exists()){
//如果配置文件不存在,則創(chuàng)建該配置文件
file.createNewFile();
}
//創(chuàng)建Properties對(duì)象。
Properties properties = new Properties();
//把配置文件的信息加載到properties中
properties.load(new FileInputStream(file));
FileOutputStream fileOutputStream = new FileOutputStream(file);
int count = 0; //定義該變量是用于保存軟件的運(yùn)行次數(shù)的。
//讀取配置文件的運(yùn)行次數(shù)
String value = properties.getProperty("count");
if(value!=null){
count = Integer.parseInt(value);
}
//判斷使用的次數(shù)是否已經(jīng)達(dá)到了三次,
if(count==3){
System.out.println("你已經(jīng)超出了試用次數(shù),請(qǐng)購(gòu)買正版軟件!!");
System.exit(0);
}
count++;
System.out.println("你已經(jīng)使用了本軟件第"+count+"次");
properties.setProperty("count",count+"");
//使用Properties生成一個(gè)配置文件
properties.store(fileOutputStream,"runtime");
}
}