? ? ? ? ? ? ? ? ? ? ? ? ? ?封裝與參數(shù)、this Static關(guān)鍵字 構(gòu)造器 塊
1.構(gòu)造器
*
* new關(guān)鍵字做的事情:
* 1.在堆中為這個對象開辟空間,并且成員屬性|變量會跟隨對象進(jìn)入到堆內(nèi)存中,并附默認(rèn)值
*? 2.調(diào)用構(gòu)造器,對對象初始化信息
*? 3.將地址返回給引用
*
* 構(gòu)造器|構(gòu)造方法|構(gòu)造函數(shù):
*? 構(gòu)造器就是一個特殊的方法
* 作用:為對象初始化信息
*? 定義:
*? 修飾符 類名(參數(shù)列表){
*? 方法體;
*? }
*? 構(gòu)造器的方法名必須與類名保持一致
*? 構(gòu)造器不需要定義返回值類型和void,可以沒有return
*? 根據(jù)需要定義return,提前結(jié)束方法|構(gòu)造器的作用
*?
*? 注意:
*? 如果沒有顯示的定義構(gòu)造器,編譯器會自動為你提供一個空構(gòu)造(參數(shù)為空的構(gòu)造器)
*? 如果有顯示定義構(gòu)造器,編譯器都不會在為你提供任何構(gòu)造器了
*?
*? 構(gòu)造器也是一個方法,就擁有方法重載的特性,可以構(gòu)成方法的重載
*? 構(gòu)造器不能和abstract,static,final一起使用
*?
*?
*? 構(gòu)造器不是創(chuàng)建對象使用的,是為對象初始化信息用的
*? 如果創(chuàng)建對象的同時就能夠確定所有屬性|某些屬性的值,可以選擇使用帶參構(gòu)造,創(chuàng)建對象的同時賦值,簡單
*? 如果創(chuàng)建對象的時候不確定屬性值,可以選擇是使用空構(gòu)造,后續(xù)知道值的時候再通過對象.屬性為某個屬性賦值
*? 只要創(chuàng)建對象肯定途中會調(diào)用構(gòu)造器
*?
*? 建議:
*? 如果以后定義這種自定義的模板類,至少提供一個空構(gòu)造
2.參數(shù)
定義方法()中的參數(shù):形式參數(shù)(形參)? 變量的聲明
調(diào)用方法()中的參數(shù):實際參數(shù)(實參)? 變量的賦值
形參和實參之間需要一一對應(yīng)
3.this 關(guān)鍵字
/*
* this 代表當(dāng)前創(chuàng)建對象,存儲當(dāng)前對象的地址
* 在構(gòu)造器的首行調(diào)用本類中的其他構(gòu)造器
* this(參數(shù)列表)
* 必須定義在構(gòu)造器首行
* 構(gòu)造器之間不能通過this相互調(diào)用
在成員方法|構(gòu)造器中用來區(qū)分同名變量問題
成員變量和局部變量之間同名問題
默認(rèn)就近原則,如果想要指代成員,通過this調(diào)用成員? this.name
如果不存在同名問題,使用成員,this.可以省略,直接寫成員的名字,如果出現(xiàn)同名不能省略,如果省略就會發(fā)生就近原則
*
* 構(gòu)造器只能跟隨new一起使用,不能調(diào)用,但是可以通過this
*? this不能和static一起使用
*/
public class ThisDemo01 {
public static void main(String[] args) {
Person p=new Person("張三",18,false,"程序猿");
p.info();
System.out.println(p);
}
}
class Person{
public String name;
public int age;
public boolean gender; //false->男? true->女
public String occupation; //職業(yè)
public Person() {
// TODO Auto-generated constructor stub
}
//就近原則? 誰離我進(jìn)我找誰
public Person(String name, int age,boolean gender) {
//參數(shù)接收到的值,實參值賦值給對象成員變量
this.name=name;
this.age=age;
this.gender=gender;
}
public Person(String pname, int page,boolean pgender,String poccupation) {
//把當(dāng)前構(gòu)造器接收到的參數(shù)值,傳遞給調(diào)用的其他構(gòu)造器,簡化代碼
this(pname,page,pgender);
occupation = poccupation;
}
public void info(){
//局部變量
String name="哈哈";
System.out.println(this.name+","+this.age+","+gender+","+occupation);
System.out.println(this);
}
}
5.Static關(guān)鍵字
/*
* static 關(guān)鍵字
* 靜態(tài)的,靜態(tài)的內(nèi)容是屬于類的,成員是屬于對象的
* static修飾變量: 靜態(tài)變量|類變量
* static是一個成員修飾符,只能用來修飾成員,不能用來修飾局部
*?
*? static修飾方法: 靜態(tài)方法|類方法
*? 靜態(tài)的內(nèi)容的使用方式:
*? 1.類名.靜態(tài)變量名? |? 類名.靜態(tài)方法名()
*? 2.對象.靜態(tài)變量名 |? 對象.靜態(tài)方法ing()
*?
*? 注意:
*? 靜態(tài)都是屬于類的,都會在類第一次加載完成之后初始化一次,靜態(tài)的變量會在靜態(tài)區(qū)中存在,多個對象共享的
*? 靜態(tài)的內(nèi)容中,可以直接使用靜態(tài)的內(nèi)容,不可以直接使用非靜態(tài)的內(nèi)容,但是可以通過對象使用
*? 成員的內(nèi)容中,可以直接使用靜態(tài)的內(nèi)容,可以直接使用非靜態(tài)的
*/
public class StaticDemo01 {
//成員變量
public int id=5;
//靜態(tài)變量
static int age=10;
//成員方法
public void test1(){
System.out.println("我是一個成員方法");
System.out.println(id);
System.out.println(age);
}
//靜態(tài)方法
public static void test2(){
System.out.println("我是一個靜態(tài)方法");
//System.out.println(this); 因為靜態(tài)的方法在調(diào)用之前可以能沒有對象,找不到對象,多以this不能使用
}
public static void main(String[] args) {
//static int a=5; //局部變量
StaticDemo01 demo=new StaticDemo01();
System.out.println(demo.id); //通過對象使用成員
System.out.println(age);? //因為在本類中
System.out.println(StaticDemo01.age);? //通過類名使用靜態(tài)變量
System.out.println(demo.age); //通過對象使用靜態(tài)變量
demo.test1(); //成員方法
demo.test2(); //靜態(tài)方法
StaticDemo01.test2();
System.out.println();
}
}
6.封裝
/*
* 安全隱患問題: 有些數(shù)據(jù)的值,不符合生活邏輯
* 介紹一個關(guān)鍵字? private 私有的
* private 成員修飾符,只能修飾成員,不能修飾局部
* 私有的內(nèi)容,只能在本類中使用,外部類中無法使用
* 私有的屬性,需要配合設(shè)置器和訪問器一起使用--> 公共的訪問方式
* 設(shè)置器setter和訪問器getter 是一個方法,是公共的
*
*
* 封裝:
* 隱藏內(nèi)部的實現(xiàn)細(xì)節(jié),對外提供公共的訪問方式
*
* 封裝的好處;
* 1.提高程序的安全性
*? 2.提高代碼的復(fù)用性(類,方法..)
*?
* 屬性私有化,配和公共的訪問方式->是java中面向?qū)ο蠓庋b的一種具體的體現(xiàn)
* 私有是封裝 對
* 封裝是私有 錯? 因為:不僅僅是私有,還有方法,類..都是封裝的體現(xiàn)
*
* 以后再定義這中模板類的代碼:(Student,Person,Car,Phone...),這系列類統(tǒng)稱都是javabean類
* 標(biāo)準(zhǔn)的javabean定義規(guī)范:
* 1.類的公共的
*? 2.至少提供一個空構(gòu)造
*? 3.屬性全部私有
*? 4.并提供公共的訪問方式
*/
public class javaBeanDemo {
public static void main(String[] args) {
Person p=new Person();
p.name="yinwei";
//p.age=-18;
p.setAge(9);
p.info();
System.out.println(p.getAge());
}
}
class Person{
public String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//age屬性的設(shè)置器
public void setAge(int age){
if(age>=0){
this.age=age;
}else{
System.out.println("年齡不合法");
this.age=18;
}
}
//age屬性的訪問器
//返回值:要 int? 參數(shù)
public int getAge(){
return this.age;
}
public void info(){
System.out.println(name+"-->"+age);
}
}
7.塊
/*
* block 塊 {}-->作用域
* {}->放在方法中->局部代碼塊|普通語句塊 執(zhí)行時機(jī):跟隨方法,放方法被調(diào)用的時候執(zhí)行
* {}->類中方法外部->構(gòu)造塊 執(zhí)行時機(jī):創(chuàng)建對象
* static{}->類中方法外->靜態(tài)塊 執(zhí)行時機(jī):類加載
*
* 構(gòu)造塊中的內(nèi)容,在編譯的時候,會被編譯到要執(zhí)行的構(gòu)造器代碼之前,如果存在多個構(gòu)造塊從上倒下一次執(zhí)行
* 靜態(tài)塊的內(nèi)容只會執(zhí)行一次,在類第一次加載之后執(zhí)行,并且只有一次,如果存在多個靜態(tài)塊從上倒下一次執(zhí)行
*
* static-->main-->構(gòu)造塊->構(gòu)造器
*/