一:習(xí)題講解
1:撰寫程序,在一個(gè)源文件中寫兩個(gè)類,一個(gè)類是Student,有一個(gè)顯示信息的方法show;
另一個(gè)類是Main,包含有入口方法,在入口方法中調(diào)用另一個(gè)類(Student)。
思考:源文件名叫什么?
如果一個(gè)源文件中包含很多類,如果有一個(gè)類中有main方法(入口方法)
那么源文件名 就是這個(gè)類名
package test;
publicclass Main {
//類是模版,對(duì)象是模版下的一個(gè)例子
publicstaticvoid main(String[] args) {
//首先要產(chǎn)生類的一個(gè)對(duì)象,也就是說產(chǎn)生一個(gè)學(xué)生對(duì)象
Student stu=new Student();
//對(duì)象是具體的。也就是說對(duì)象的屬性要賦值的
stu.name="張三";
stu.sex="男";
stu.age=20;
stu.show();
}
}
class Student{
String name;
String sex;
intage;
//作用就是顯示信息
publicvoid show(){
System.out.println("姓名="+name+",性別="+sex+",年齡="+age);
}
}
這個(gè)例子還有很多可以改進(jìn)的地方
A:希望在stu.show();這條語句上面,把鼠標(biāo)放上去能夠出現(xiàn)中文注釋。起到說明注釋作用
推廣,在任何方法上,通過把鼠標(biāo)放上去能夠出現(xiàn)中文注釋。起到說明注釋作用。
怎么做?在要顯示的方法上面打上/** 回車
/**
*顯示信息
*/
publicvoid show(){
System.out.println("姓名="+name+",性別="+sex+",年齡="+age);
}
/**
*得到姓名
*@return字符串
*/
public String getName(){
returnname;
}
總結(jié),java的注釋有3種 // /**/ /**
B:顯示信息的方法,java 最好采用一個(gè)固定的方法 toString 不要使用什么show,print等其他方法,雖然說其他方法沒有錯(cuò)
toStirng 是固定寫法
/**
*用來顯示信息
*/
public String toString() {
// TODO Auto-generated method stub
return"姓名="+name+",性別="+sex+",年齡="+age;//return 后面就是格式化信息
}
toString 這種方法 怎么調(diào)用呢?
Student stu=new Student();
//對(duì)象是具體的。也就是說對(duì)象的屬性要賦值的
stu.name="張三";
stu.sex="男";
stu.age=20;
//stu.show();
System.out.println(stu);//輸出學(xué)生信息會(huì)自動(dòng)調(diào)用toString
C:改進(jìn)第3個(gè)
Student類的屬性 name,sex,age 我們希望不能夠隨便被別的類修改,要進(jìn)行限制
stu.name="張三";
stu.sex="男";
stu.age=20;
為什么限制,如果能夠被隨便修改的話,會(huì)導(dǎo)致name,sex,age 不符合現(xiàn)實(shí)要求.
比如 sex=“ssss”,age=“-100”;
那么怎么做,才能夠限制呢?就是面向?qū)ο蟮?/span>3大特征之一:封裝!
2:有一個(gè)賬戶,賬戶中有存款余額,您可以對(duì)賬戶進(jìn)行存款與提款的動(dòng)作,
并可以查詢以取得存款余額。使用面向?qū)ο蟮姆绞椒治觯?/span>
說明其中的類,對(duì)象并列舉他的屬性和方法。
面向?qū)ο蟮姆治觯趺捶治?/span>
賬戶
靜態(tài)特征:余額
動(dòng)態(tài)特征:存款,提款,查詢
package test;
publicclass Account{
floatye=10f;
/**
*存錢
*@paramc存多少錢
*/
publicvoid cunkuan(float c){
ye=ye+c;
}
/**
*取錢
*@paramc取多少錢
*@return得到多少錢
*/
publicfloat qukuan(float c){
if(c>=ye){
System.out.println("余額不足");
return 0;
}else{
ye=ye-c;
return c;
}
}
public String toString(){
return"余額為="+ye;
}
}
package test;
publicclass Test {
/**
*@paramargs
*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
/*
*從第1句代碼到最后一句,都是面向?qū)ο蟮?/span>
*a.cunkuan(100f);只告訴做什么事,具體怎么做交給了cunkuan的方法了
*/
Account a=new Account();
a.cunkuan(100f);
System.out.println(a);
a.qukuan(1000f);
System.out.println(a);
a.qukuan(10f);
System.out.println(a);
}
}
變量的作用域!
面向?qū)ο笥?/span>3大特征:封裝,繼承,多態(tài)
1:為什么需要封裝
對(duì)于
stu.name="張三";
stu.sex="男";
stu.age=20;
這3行代碼,可以推廣,對(duì)于任何類的屬性,都是需要賦值。賦值是不是有含義
比如age 可以賦值為有含義,也可以賦值為-100 這種沒有含義的值。
所以我們希望 能夠?qū)傩再x值的時(shí)候,進(jìn)行限制。!!!
這就是為什么需要封裝的原因
2:封裝是什么意思 就是隱藏細(xì)節(jié)。目的是 不能直接看到,或者訪問到
為什么需要封裝 做個(gè)例子
package test2;
publicclass YgTeacher1 {
public String name;
//String name 前面寫public
//意味著這個(gè)name賦值可以在任意類下的YgTeacher1類的對(duì)象賦值
publicintage;
/**
*返回自我介紹的內(nèi)容
*/
public String introduction() {
return "大家好!我是" + name + ",我今年"+ age+"歲";
}
}
package test2;
publicclass YgTeacher1Test {
publicstaticvoid main(String[] args) {
YgTeacher1 teacher = new YgTeacher1();
teacher.name = "李芳";
teacher.age = -10;
System.out.println(teacher.introduction());
}
}
對(duì)于teacher對(duì)象 我們賦值為李芳與-10,這樣才語法角度是沒有問題,因?yàn)槟軌虺稣_結(jié)果
但是從現(xiàn)實(shí)角度,是不符合現(xiàn)實(shí) 所以我們要改進(jìn),要限制屬性的賦值!!!
那么怎么給屬性賦值有含義,我們通過封裝去解決
3:怎樣才能夠給屬性封裝
A:屬性私有化 也就是說在屬性前面加上private 關(guān)鍵字 private 私有的
private 含義就是只能在這個(gè)類中訪問(賦值與取值) 在別的類中是不能直接賦值的!teacher.name = "李芳";
teacher.age = -10; 會(huì)報(bào)錯(cuò)
B:提供公有方法訪問私有屬性
公有方法 就是在方法前面加上public
我們這種公有方法的作用就是 對(duì)私有屬性進(jìn)行賦值 與取值。所以把這類
公有方法叫做 setters方法和getters方法
package test2;
//類應(yīng)該來說改進(jìn)后的代碼
publicclass YgTeacher2 {
//第一步在所有屬性前加私有關(guān)鍵字 private
private String name;
privateintage;
//第二步設(shè)置所有私有屬性的set 和get方法
//set方法就是以set開頭的方法,就是就是賦值
//get方法就是以get開頭的方法,就是返回值取值
//可以采用快捷方式
//source -->generate getters and setters方法
public String getName() {
returnname;
}
publicvoid setName(String name) {
//this 是個(gè)關(guān)鍵字
//this 表示哪個(gè)對(duì)象調(diào)用方法,那么this就是哪個(gè)對(duì)象
//this 可以區(qū)別屬性與參數(shù)的
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {//可以通過if 來限制屬性賦值必須有含義
this.age = age;
if(age<22){
System.out.println("賦值太小");
this.age=22;
}
}
public String toString() {
// TODO Auto-generated method stub
return"name="+name+",age="+age;
}
}
package test2;
publicclass YgTeacher2Test {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
YgTeacher2 gjy=new YgTeacher2();
gjy.setName("gjy");
gjy.setAge(23);
System.out.println(gjy);
YgTeacher2 w=new YgTeacher2();
w.setName("w");
w.setAge(19);
System.out.println(w);
}
}
4:給屬性賦值,難道只有一個(gè)封裝嗎?沒有別的方法嗎?
肯定不止,還有構(gòu)造方法也可以給屬性賦值!!!
封裝通過set方法給屬性賦值
創(chuàng)建對(duì)象時(shí),通過構(gòu)造方法給屬性賦值
構(gòu)造方法的語法:
名字與類名一樣,還有沒有返回類型
package test2;
publicclass YgTeacher3 {
private String name;
privateintage;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
//沒有參數(shù)的構(gòu)造方法
//構(gòu)造方法的作用就是給屬性賦值
//構(gòu)造方法什么時(shí)候調(diào)用:在創(chuàng)建對(duì)象的時(shí)候調(diào)用
public YgTeacher3(){
this.name="yg1";
this.age=22;
}
public String toString() {
returnname+","+age;
}
}
package test2;
publicclass YgTeacher3Test {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
//new YgTeacher3();這句代碼執(zhí)行,會(huì)自動(dòng)調(diào)用沒有參數(shù)的構(gòu)造方法
//因?yàn)?/span>YgTeacher3()括號(hào)中沒有參數(shù)
YgTeacher3 yg=new YgTeacher3();
System.out.println(yg);
}
}
構(gòu)造方法的分類
構(gòu)造方法可以分2類 1是沒有參數(shù)的構(gòu)造方法
2是有參數(shù)的構(gòu)造方法
這2類構(gòu)造方法可以寫在一個(gè)類中
package test2;
publicclass YgTeacher3 {
private String name;
privateintage;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
//沒有參數(shù)的構(gòu)造方法
//構(gòu)造方法的作用就是給屬性賦值
//構(gòu)造方法什么時(shí)候調(diào)用:在創(chuàng)建對(duì)象的時(shí)候調(diào)用
public YgTeacher3(){
this.name="yg1";
this.age=22;
}
public YgTeacher3(String name,int age){
this.name=name;
this.age=age;
}
public String toString() {
returnname+","+age;
}
}
package test2;
publicclass YgTeacher3Test {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
//new YgTeacher3();這句代碼執(zhí)行,會(huì)自動(dòng)調(diào)用沒有參數(shù)的構(gòu)造方法
//因?yàn)?/span>YgTeacher3()括號(hào)中沒有參數(shù)
YgTeacher3 yg=new YgTeacher3();
System.out.println(yg);
YgTeacher3 yg2=new YgTeacher3("yg",34);
System.out.println(yg2);
}
}
方法的分類
1:實(shí)例方法 或叫成員方法 (除了構(gòu)造方法外的都是實(shí)例方法)
實(shí)例方法就是類產(chǎn)生實(shí)例(對(duì)象)后調(diào)用的方法,有幾個(gè)對(duì)象,那么就可以調(diào)用實(shí)例方法
實(shí)例方法的語法呢,
2:構(gòu)造方法
3:靜態(tài)方法
語法:在方法中有static 這個(gè)關(guān)鍵字!就是靜態(tài)方法 static 就是靜態(tài)
最典型的static 方法
public static void main(String []args){
}
作用:從內(nèi)存上說,靜態(tài)方法和靜態(tài)變量都是屬于類的。無論產(chǎn)生多少個(gè)對(duì)象
靜態(tài)方法和靜態(tài)變量都只有一個(gè)。
package test;
publicclass Test {
staticinti=1;//在變量前面加一個(gè)static 就是靜態(tài)變量
intj=1;//一般的變量也叫實(shí)例變量
publicstaticvoid main(String[] args) {//靜態(tài)方法
//靜態(tài)方法中只能放靜態(tài)方法和靜態(tài)變量和實(shí)例變量
Test t=new Test();//當(dāng)運(yùn)行new Test()的時(shí)候
//要自動(dòng)分配內(nèi)存,i 靜態(tài)變量會(huì)分配內(nèi)存,并且只分配一次
//無論后面產(chǎn)生多少個(gè)對(duì)象,靜態(tài)變量只分配一次
//j 實(shí)例變量也會(huì)分配內(nèi)存但是是產(chǎn)生一個(gè)對(duì)象就分配一次內(nèi)存
t.i++;//2
//靜態(tài)變量和方法的調(diào)用可以是t.i 對(duì)象名.靜態(tài)方法或變量
//也可以類名.靜態(tài)變量或方法
t.j++;// 2
Test t2=new Test();
t2.i++;//3
t2.j++; //2
System.out.println("i="+t.i);//t.i 和t2.i 都是3 也就是說i是屬于類的
//跟對(duì)象無關(guān)
System.out.println("j="+t.j);
System.out.println("i="+t2.i);
System.out.println("j="+t2.j);
}
}
為什么要使用封裝?!
因?yàn)槲覀円獙?duì)屬性賦值要進(jìn)行限制。使屬性值要有含義
屬性賦值 :有2種方式
第一個(gè)就是封裝
A:給屬性私有化
B:產(chǎn)生setters和getters方法
第二個(gè)就是構(gòu)造方法
一般在類中提供幾個(gè)構(gòu)造方法,可以根據(jù)不同的要求,調(diào)用不同參數(shù)的構(gòu)造方法
方法重載!!!
什么是方法重載
有幾個(gè)方法(無論是實(shí)例方法還是構(gòu)造方法),它們的方法名一樣,但是參數(shù)的類型或個(gè)數(shù)不一樣。跟修飾符與返回類型無關(guān)。并且這幾個(gè)方法在一個(gè)類中。這就是方法重載
生活中有很多方法重載的例子
比如說 吃 吃這個(gè)方法,我們可以隨便定義2個(gè)
Public void eat(){
Syso(“吃飯”);
}
Public int eat(String type){
If(type==”筷子”){
}
If(type=”叉子”){
}
}
Java 語言 本身提供了很多方法重載的例子
package test;
publicclass Test {
publicstaticvoid main(String[] args) {
double d=10.0;
//println 就是典型的方法重載
System.out.println("s");
System.out.println(d);
System.out.println(Math.abs(-10));//求-10的絕對(duì)值
System.out.println(Math.random());//求0-1之間的隨機(jī)數(shù),是double類型
//Math 這是一個(gè)數(shù)學(xué)類,是java本身提供的。在java.lang這個(gè)包下
//Math.abs 這是類名.方法名這是方法必須是靜態(tài)方法下才能夠使用
}
}
構(gòu)造方法也可以重載
public YgTeacher3(){
this.name="yg1";
this.age=22;
}
public YgTeacher3(String name,int age){
this.name=name;
this.age=age;
}