Java零基礎(chǔ)小白入門課
Java基礎(chǔ)入門
最近開發(fā)安卓,很多東西不會,都是簡書,博客園,csdn博客上看到很多很多人寫了各種教程,終于跌跌撞撞把東西給寫出來,正好教一個親戚的朋友零基礎(chǔ)Java,也把教程整理一下,做得比較另類,大概適合95后00后肥宅
類和對象
Java的哲學體系中,所有的東西都是對象,所有的對象都屬于某一種類
同樣屬性的對象屬于同一種類,類的基礎(chǔ)類是Object,其他類都是基礎(chǔ)類的衍生,衍生包括了基礎(chǔ)類的所有信息,除了private的成員變量
類的成員一般有變量和函數(shù),當然有些是接口什么,以后再說
類的繼承
除了Object基礎(chǔ)類外,其他類都可以視為某一種類型的子類,包含了父類的private以外所有屬性
比如類 人類 class Person
{
public String name="";//最好是字符串直接定義為空字符串,否則引用的時候會報錯
}
人類有共同的屬性如姓名,出生日期,國籍,身高體重等等
class Man extends Person
class Woman extends Person
可以衍生出兩個子類,男人和女人
然后還有各自類特有的,比如男人長胡子,那么Man類里面就有成員變量moustache,表示一個男人的胡子
然后,男人中,有很多屌絲,屌絲也是男人里的一種
屌絲可以寫作
class Diaosi extends Man,此處特指男屌絲
{
private Woman girlfriend=null;//屌絲怎么可能有女朋友呢!
}
一般別人項目的寫法,成員變量都是private,防止你胡亂修改,當你要獲取某個成員變量的時候,你需要獲得公開的接口
一般是public接口,這樣任何人都可以引用一下就訪問,protected就只有自己的子類可以訪問,private則只有本對象可以訪問,如果不寫則是同一包里可以訪問
public/不寫/protected/private有兩個維度的屬性,一種是繼承,一種是外界訪問權(quán)限
當我們遇到一個屌絲,我們叫做new一個
Diaosi Diaosi1=new Diaosi();//這就是構(gòu)造函數(shù),會調(diào)用Diaosi{ public Diaosi(){}}這個構(gòu)造函數(shù),如果調(diào)用帶參數(shù),那么會自動找相應參數(shù)表的函數(shù)
Diaosi1就是這個對象的引用地址
當我要問屌絲的女朋友叫什么的時候,就獲取屌絲的女朋友這個對象,然后返回這個人的成員變量:名字
就算她的名字是private String name,外界不可訪問,那么可以public String getname(){return this.name}來獲取
public String askGirlfriendName()
{
? ?return girlfriend.name;
}
調(diào)用就是對象名.函數(shù)名(參數(shù)) Diaosi1.askGirlfriendName();
就比如你要問,屌絲屌絲,你的女朋友叫什么啊,返回的是字符串類型
這句話看上去沒問題,但其實是錯誤的,因為很失禮!
屌絲怎么可能有女朋友呢,屌絲會回復你,找不到對象object,然后程序報錯
因為girlfriend==null,所以無法尋找它的成員變量屬性,這就是報錯的原因
所以,我們問屌絲女朋友叫什么名字,需要禮貌地試探,先問屌絲有沒有女朋友,有的話再問對方名字,而不是直接上來就問屌絲女朋友叫什么,不論是說話,還是寫程序,都是這個道理
于是我們改寫函數(shù)
public String askGirlfriendName_v2()
{
? ?if (girlfriend!=null)
? ? ? return girlfriend.name;
? ?return null;//屌絲沒有女朋友,所以你問屌絲的女朋友沒有名字,就無法回答你
}
既然是String類型函數(shù),就必須返回字符串(也可以是null),所以當屌絲沒有女朋友的時候,他會回復你一個null
當然,屌絲A說我的女朋友是Gakki新垣結(jié)衣,屌絲B說好巧啊我綠了你,我的女朋友也是新垣結(jié)衣
有個梗就是很多視頻都說:你們的女朋友(老婆)新垣結(jié)衣,大概全中國有十幾萬男生號稱新垣結(jié)衣是他女朋友
PS:B站文章必須要有圖,所以不得不找了一張Gakki,不得不說倭妹不符合我審美,挑來挑去一點也不覺得好看,沒辦法屌絲們熟悉

那么,這個作為一個類的公用成員變量,就涉及到Java的一個基礎(chǔ)概念:靜態(tài)
就是一個類所有成員所共有公用的
屌絲們的女朋友都是新垣結(jié)衣,那么首先要有這么一個新垣結(jié)衣的女的
public class Woman extends Person{
? public static Gakki=new Woman("新垣結(jié)衣");//因為Gakki一般就是指新垣結(jié)衣
}
這樣,Woman就需要一個構(gòu)造函數(shù),附帶一個初始變量,就是名字
當然這個構(gòu)造函數(shù)寫在Person里更加科學,因為不論男人女人都有名字,而且一般來說,名字是唯一標識
public class Person{
? ?public Person(String name)
? ?{
? ? ? this.name=name;//請注意,引用name是當前環(huán)境下的變量優(yōu)先,如果要特指該對象的成員變量,必須加this,this.name表示這個對象的成員變量,name表示當前環(huán)境下的name,就是帶進來的參數(shù)
? ?}
}
這個函數(shù),只要不是private,那么所有它的子類都可以用
那我判斷你們兩個有沒有綠了對方
public boolean bgreenyou(Man man1,Man man2)
{
? ?return man1.girlfriend==man2.girlfriend;//如果兩個人的女朋友指向同一個對象,表示這哥倆互相綠了對方
? ?//但是這句話有問題,就是當這兩個屌絲都沒有女朋友的時候,雙方的女朋友都是null,那么也會表示等式相等,兩個傻屌絲會開心地以為自己綠了對方,抱歉你們想多了,你們是屌絲!
? ?所以要加and條件?
? ?return man1.girlfriend==man2.girlfriend&&man1.girlfriend!=null;
? ?
? ?
? ?//還可以以雙方的名字是否相等來 ??
? ?return (man1.askGirlfriendName_v2().equals(man2.askGirlfriendName_v2());
? ?//這里暫且粗暴地以姓名相同為標準,當兩個屌絲的老婆名字相同時,他們就綠了,比如都叫新垣結(jié)衣
? ?//此處要說一個知識點,就是在java中,字符串是否內(nèi)容相等不是C語言里的==,而必須用equals,如果大小寫不同也算相等,那么還有equalsIgnoreCase()
? ?//第二個知識點,這一部分也可能報錯,因為equals是字符串類的函數(shù),執(zhí)行這個函數(shù),必須首先有這個對象
? ?//而沒有女朋友的屌絲,你問他女朋友叫什么名字,返回的是無,就是null,null并不是一個Object,更不是字符串類型的對象,所以它沒有成員變量
? ?//當askGirlfriendName_v2()返回的結(jié)果是null,你不能調(diào)用null的任何成員變量,所以這一句會報錯的,那我們怎么修改呢,看下面
}
public String askGirlfriendName_v3()
{
? ?if (girlfriend!=null)
? ? ? return girlfriend.name;
? ?return "";//你要確保返回的必須是一個字符串,哪怕是一個空字符串,也能確保程序不報錯彈出,這就像屌絲說:我還不知道我女朋友叫什么,也比沒有女朋友好
}
后來,屌絲也覺得這樣撒謊很沒面子,就說自己的女朋友是新垣結(jié)衣
這樣,當你問起屌絲有沒有女朋友的時候,有的屌絲就算沒有,也會指著屏幕,說,看,屏幕上面的新垣結(jié)衣就是我女朋友
public String askGirlfriendName_v4()
{
? ?if (girlfriend!=null)
? ? ? return girlfriend.name;//有女朋友的,就告訴對方自己的女朋友叫什么
? ?return Woman.Gakki.name;//沒有女朋友的,就說自己的女朋友是新垣結(jié)衣
}
靜態(tài)成員變量的引用方法,是類名.變量名,比如Woman.gakki就是新垣結(jié)衣
動態(tài)成員變量的引用方法,是對象名.變量名,如上面屌絲,當然在本對象里面,可以寫this.或者直接不寫
你們(共同)的女朋友,可以這樣寫
public class Diaosi extends Man{
? ?public static Woman commonGirlfriend=Woman.Gakki;
}
//請注意這里不要寫成new Woman("新垣結(jié)衣");因為你每new一個就會新增一個對象,而實際上這里指向的是Woman.Gakki,既然對象已經(jīng)新建,直接引用就可以了,一般不能重新建立兩次對象,會產(chǎn)生邏輯錯誤
如果后來變成了橋本環(huán)奈,那么就先要有這么一個人
new Woman("橋本環(huán)奈");//這個只執(zhí)行一次,那么,怎么定位到這個對象呢,我們可以這樣寫
一種是靜態(tài),就像Gakki就是新垣結(jié)衣,但問題是橋本環(huán)奈似乎沒有這種外號,怎么辦
public class Woman extends Person{
? ?public static List<Woman> allWomenList=new ArrayList<Woman>();//這是唯一的靜態(tài)列表
? ?public Woman(String name)
? ?{
? ? ?this.name=name;
? ? ?allWomenList.add(this);//把每個new新建的女人都加到靜態(tài)的女人列表中
? ?}
? ?public static Woman findWomanbyName(String name)
? ?{//暫且粗暴地以名字為唯一互斥標識
? ? ? for (Woman woman:allWomenList)
? ? ? ? if (name.equals(woman.name))//這樣寫的好處是,參數(shù)name是確定的字符串不是null,而woman.name有可能是null,當碰上的時候,如果寫woman.name.equals會報錯
? ? ? ? ? ? return woman;
? ? ? return null;
? ?}
}
//每個類在第一次初始化的時候,所有的static靜態(tài)的類成員變量都會執(zhí)行初始化一次
//每個類所屬的對象在構(gòu)造建立的時候,成員變量都會執(zhí)行一遍
后來,世界上出現(xiàn)了二次元肥宅,他們的老婆是橋本環(huán)奈
如果肥宅都是屌絲,屌絲都是男人,那么可以建立多層繼承關(guān)系
public class Feizhai extends Diaosi{
? ? public static Woman commonGirlFriend=Woman.findWomanbyName("橋本環(huán)奈");
}
如果你要說所有屌絲的女朋友一開始都是新垣結(jié)衣,然后后來才逐漸換成橋本環(huán)奈,那么這樣寫
public class Diaosi extends Man{
? ?public Woman girlfriend=Woman.Gakki;
}
每個屌絲的女朋友從新垣結(jié)衣改成橋本環(huán)奈的時候,就是每個diaosi.girlfriend=Woman.findWomanbyName("橋本環(huán)奈");
這里的diaosi就必須是對象,而不能是類,如果是類的話
就是:你們的老婆
后來,橋本環(huán)奈又成為了中國肥宅們號稱的女朋友
Diaosi.commonGirlFriend=Woman.findWomanbyName("橋本環(huán)奈");