/*
成員變量和局部變量的區別?
A:在類中的位置不同
成員變量:在類中方法外
局部變量:在方法定義中或者方法聲明上
B:在內存中的位置不同
成員變量:在堆內存
局部變量:在棧內存
C:生命週期不同
成員變量:隨着對象的創建而存在,隨着對象的消失而消失
局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
D:初始化值不同
成員變量:有默認初始化值
局部變量:沒有默認初始化值,必須定義,賦值,然後才能使用。
注意事項:
局部變量名稱可以和成員變量名稱一樣,在方法中使用的時候,採用的是就近原則。
*/classVarialbe{//成員變量//int num = 10;
int num;//0publicvoidshow(){//int num2 = 20; //局部變量//可能尚未初始化變量num2//int num2; //沒有默認值
int num2 =20;
System.out.println(num2);//int num = 100;
System.out.println(num);}}classVariableDemo{publicstaticvoidmain(String[] args){
Varialbe v =newVarialbe();
System.out.println(v.num);//訪問成員變量
v.show();}}
方法的形式參數是類名的時候如何調用
/*
形式參數的問題:
基本類型:形式參數的改變不影響實際參數
引用類型:形式參數的改變直接影響實際參數
*///形式參數是基本類型classDemo{public int sum(int a,int b){return a + b;}}//形式參數是引用類型classStudent{publicvoidshow(){
System.out.println("我愛學習");}}classStudentDemo{//如果你看到了一個方法的形式參數是一個類類型(引用類型),這裏其實需要的是該類的對象。publicvoidmethod(Student s){//調用的時候,把main方法中的s的地址傳遞到了這裏 Student s = new Student();
s.show();}}classArgsTest{publicstaticvoidmain(String[] args){//形式參數是基本類型的調用
Demo d =newDemo();
int result = d.sum(10,20);
System.out.println("result:"+result);
System.out.println("--------------");//形式參數是引用類型的調用//需求:我要調用StudentDemo類中的method()方法
StudentDemo sd =newStudentDemo();//創建學生對象
Student s =newStudent();
sd.method(s);//把s的地址給到了這裏}}
匿名對象的概述和應用
/*
匿名對象:就是沒有名字的對象。
匿名對象的應用場景:
A:調用方法,僅僅只調用一次的時候。
注意:調用多次的時候,不適合。
那麼,這種匿名調用有什麼好處嗎?
有,匿名對象調用完畢就是垃圾。可以被垃圾回收器回收。
B:匿名對象可以作爲實際參數傳遞
*/classStudent{publicvoidshow(){
System.out.println("我愛學習");}}classStudentDemo{publicvoidmethod(Student s){
s.show();}}classNoNameDemo{publicstaticvoidmain(String[] args){//帶名字的調用
Student s =newStudent();
s.show();
s.show();
System.out.println("--------------");//匿名對象//new Student();//匿名對象調用方法newStudent().show();newStudent().show();//這裏其實是重新創建了一個新的對象
System.out.println("--------------");//匿名對象作爲實際參數傳遞
StudentDemo sd =newStudentDemo();//Student ss = new Student();//sd.method(ss); //這裏的s是一個實際參數//匿名對象
sd.method(newStudent());//在來一個newStudentDemo().method(newStudent());}}
/*
private:
是一個權限修飾符
可以修飾成員變量和成員方法
被其修飾的成員只能在本類中被訪問
*/classDemo{//int num = 10;//用private修飾private int num =10;publicvoidshow(){
System.out.println(num);}privatevoidmethod(){
System.out.println("method");}publicvoidfunction(){method();}}classPrivateDemo{publicstaticvoidmain(String[] args){
Demo d =newDemo();//不能方法私有的成員變量//System.out.println(d.num);
d.show();//不能訪問私有的成員方法//d.method();
d.function();}}
private的應用標準案例
/*
封裝和private的應用:
A:把成員變量用private修飾
B:提高對應的getXxx()和setXxx()方法
*///定義學生類classStudent{//姓名private String name;//年齡private int age;//姓名獲取值public String getName(){return name;}//姓名設置值publicvoidsetName(String n){
name = n;}//年齡獲取值public int getAge(){return age;}//年齡賦值publicvoidsetAge(int a){
age = a;}}//測試類classStudentTest{publicstaticvoidmain(String[] args){//創建學生對象
Student s =newStudent();//使用成員變量//錯誤:被私有修飾了,外界不能直接訪問了//System.out.println(s.name+"---"+s.age);
System.out.println(s.getName()+"---"+s.getAge());//給成員變量賦值//s.name = "林青霞";//s.age = 27;//通過方法給賦值
s.setName("林青霞");
s.setAge(27);
System.out.println(s.getName()+"---"+s.getAge());}}
/*
定義一個類Demo,其中定義一個求兩個數據和的方法,
定義一個測試了Test,進行測試。
變量什麼時候定義爲成員變量:
如果這個變量是用來描述這個類的信息的,那麼,該變量就應該定義爲成員變量。
變量到底定義在哪裏好呢?
變量的範圍是越小越好。因爲能及時的被回收。
*///方式1/*
class Demo {
public int sum() {
int a = 10;
int b = 20;
int c = a + b;
return c;
}
}
*///方式1滿足了我們的要求,但是不好。//因爲參與操作的數據現在是固定的。//方式2/*
class Demo {
public int sum(int a,int b) {
return a + b;
}
}
*///方式2可以滿足我們的要求,但是呢我們學習過來面向對象的思想。//我就再想,a,b可不可以定義爲成員變量呢?//如果可以,我們再改進一版classDemo{
int a;
int b;public int sum(){return a + b;}}//雖然這種方式可以,並且好像是符合了面向對象的思想。//但是不好。//因爲我們曾經說過:類是一組相關的屬性和行爲的集合。//並且類是通過事物轉換過來的//而類中的成員變量就是事物的屬性//屬性是用來描述事物的//同理:成員變量其實是用來描述類的。//測試類classTest{publicstaticvoidmain(String[] args){//創建對象//方式1測試/*
Demo d = new Demo();
System.out.println(d.sum());
*///方式2測試/*
Demo d = new Demo();
int a = 10;
int b = 20;
System.out.println(d.sum(a,b));
*///方式3測試
Demo d =newDemo();
d.a =10;
d.b =20;
System.out.println(d.sum());}}
長方形案例練習
/*
定義一個長方形類,定義 求周長和麪積的方法,
然後定義一個測試了Test2,進行測試。
長方形的類:
成員變量:
長,寬
成員方法:
求周長:(長+寬)*2;
求面積:長*寬
注意:
import必須出現在所有的class前面。
*/import java.util.Scanner;classChangFangXing{//長方形的長private int length;//長方形的寬private int width;publicChangFangXing(){}//僅僅提供setXxx()即可publicvoidsetLength(int length){this.length = length;}publicvoidsetWidth(int width){this.width = width;}//求周長public int getZhouChang(){return(length + width)*2;}//求面積public int getArea(){return length * width;}}classTest2{publicstaticvoidmain(String[] args){//創建鍵盤錄入對象
Scanner sc =newScanner(System.in);
System.out.println("請輸入長方形的長:");
int length = sc.nextInt();
System.out.println("請輸入長方形的寬:");
int width = sc.nextInt();//創建對象
ChangFangXing cfx =newChangFangXing();//先給成員變量賦值
cfx.setLength(length);
cfx.setWidth(width);
System.out.println("周長是:"+cfx.getZhouChang());
System.out.println("面積是:"+cfx.getArea());}}
/*
定義一個類MyMath,提供基本的加減乘除功能,然後進行測試。
*/import java.util.Scanner;classMyMath{//加法功能public int add(int a,int b){return a + b;}//減法功能public int sub(int a,int b){return a - b;}//乘法功能public int mul(int a,int b){return a * b;}//除法功能public int div(int a,int b){return a / b;}}//測試類classMyMathTest{publicstaticvoidmain(String[] args){//創建鍵盤錄入對象
Scanner sc =newScanner(System.in);
System.out.println("請輸入第一個操作數:");
int firstNumber = sc.nextInt();
System.out.println("請輸入第二個操作數:");
int secondNumber = sc.nextInt();//創建MyMath對象,並使用
MyMath mm =newMyMath();
System.out.println("加法結果:"+mm.add(firstNumber,secondNumber));
System.out.println("減法結果:"+mm.sub(firstNumber,secondNumber));
System.out.println("乘法結果:"+mm.mul(firstNumber,secondNumber));
System.out.println("除法結果:"+mm.div(firstNumber,secondNumber));}}