/*
- 類中屬性的聲明與使用
- 屬性(成員變量)與局部變量的區別
- 1,相同點
- 1.1定義變量的形式都是:數據類型 變量名 = 變量值
- 1.2都需要先聲明,再使用
- 1.3變量都有其對應的作用域和生命週期。
- 2,不同點
- 2.1 位置不同
- 屬性(成員變量):直接聲明在類的一對{}內部
- 局部變量:聲明在方法內,方法形參,代碼塊內,構造器形參,構造器內部的變量
- 2.2 權限修飾符不同
- 屬性:可以在聲明屬性的同時,通過使用權限修飾符指明其權限
- 常用權限修飾符:public private protected,缺省(default),
- public :可以被本類,本包,子類,外部類使用
- private:可以被類內部使用,不可以被本包,子類,外部包使用
- protected:可以被本類,本包,子類使用,不可以被外部包使用
- 缺省(default):可以被本類,本包使用,不可以被子類,外部包使用
- 其他:static ,final,abstract 不是權限修飾符
- 初級學習暫用缺省
- 局部變量:不能使用權限修飾符,可以用final;
- 2.3 默認初始化值
- 屬性 :類的屬性根據其類型都有默認初始化值,與數組的初始化值相同
- 整形(byte,short,int,long)初始值0
- 浮點型(float,double)初始值0.0
- 字符型(char) 初始值0 或’\u0000’
- 布爾型(boolean)初始值false
- 引用數據類型(類,數組。接口)初始值null
- 局部變量:
- 沒有默認初始化值,在調用局部變量之前必須顯式賦值
- 局部變量中的形參在調用時賦值即可
- 2.4 在內存中加載的位置不同
- 屬性(非Static情況下):加載到堆空間中,static情況下加載在方法區中
- 局部變量:加載到虛擬機棧空間中
*/
/*-------------------------------------------------------------
- 類中方法的聲明與使用
- 方法描述類所具有的功能,也叫函數或過程,java中的方法不能獨立存在,只能在類中定義。
- 將功能封裝爲方法的目的是可以實現代碼複用,簡化代碼。
- 方法的聲明格式:
- 修飾符 (是否static)(是否有返回值)方法名(參數類型1 形參1,參數類型2 形參2,…){
-
方法體;
-
return 返回值;//如果無返回方法名前加void
- }
- 說明1:java 的權限修飾符四種:public ,private,protected,缺省default前兩種常用
- 說明2:返回值類型:有返回值,無返回值。
- 如果方法有返回值則必須在方法聲明時,指定返回值類型,同時方法中需要使用return關鍵字返回指定類型的變量或常量數據
- 如果方法沒有返回值,則方法聲明時,使用void來表示,通常沒有返回值的方法體中不使用return,如果使用只能“return;”
- 表示結束此方法,return後不可再寫表達式。
- 設計方法時是否返回數值:1,看功能需求2,按經驗處理
- 說明3: 方法名屬於標識符,命名需遵循標識符設計規範,避免關鍵字,見名知意
- 說明4:方法可以不聲明形參,也可以聲明多個形參。
- 設計方法時要不要定義形參:1,看功能需求2.按經驗處理
- 說明5:方法體,方法功能的體現
- return關鍵字的使用:
- 1,使用範圍:方法體中
- 2,作用:1,結束一個方法。2,針對有返回類型的方法,使用“return 數據”,結束方法的同時返回數據
- 3,return之後不可以再聲明執行語句。
- 方法的調用
- 方法通過方法名被調用,且只有被調用時纔會執行
- 方法的使用中,可以調用當前類的屬性與方法
- 如果方法A中又調用方法A,則方法A是遞歸方法
- 方法的注意事項
- 1,方法被調用一次就會執行一次
- 2,沒有具體返回值的情況下方法體中可以沒有return語句,如果有僅用來結束方法
- 3,定義方法時,方法的結果應該返回給調用者,交給調用者處理
- 4,方法中只能調用方法或者屬性,不能在方法內部再定義方法
- 5,方法之中不能再定義方法
*/
package com.atguigu.contact;
import java.util.*;
public class Object2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//測試Parameter類
Parameter p = new Parameter();
System.out.println(p.isWisdom);
System.out.println(p.name);
System.out.println(p.age);
p.age = 30;
System.out.println(p.age);
// System.out.println(p.weight);//無法直接調用private修飾的屬性
System.out.println(p.getWeight());//可以通過方法調用weight
p.setWeight(10);//可以通過方法修改weight
System.out.println(p.name + "已經" + p.getWeight() + "Kg了");
p.sleep(10);
//測試Person2類
Person2 person = new Person2();
person.name = "jery";
person.age = 21;
person.sex = '女';
person.addAge(2);//23
int newAge = person.addAge(2);//25
System.out.println(person.name + " is " + newAge + " years old");//25
person.showAge();//25
person.study(4);
Person2 person1 = person;
person1.addAge(10);
person.showAge();//35
Person2 person2 = new Person2();
person2.showAge();//0
person2.addAge(24);
person2.showAge();//24
person.showAge();//35
//測試Circle 類
Circle c = new Circle();
System.out.println("請輸入圓的半徑");
c.setRadius(scan.nextDouble());
//或者直接 c.radius = scan.nextDouble();
System.out.println("圓的面積是" + c.area() );
//測試Rectangle類
Rectangle rec = new Rectangle();
rec.print();
System.out.println("矩形面積爲" + rec.print());
System.out.println(rec.print());//可以直接在syso內填入方法,輸出圖形和返回值。
//對於JVM來說這裏代表的是變量,變量值是方法的返回值
//測試Rectangle1類
Rectangle1 rec1 = new Rectangle1();
System.out.println("請輸入矩形的長度");
// rec1.length = scan.nextInt();
rec1.setLength(scan.nextInt());
System.out.println("請輸入矩形的寬度");
// rec1.width = scan.nextInt();
rec1.setWidth(scan.nextInt());
rec1.print();
System.out.println("矩形的面積是 " + rec1.area());
//測試Rectangle2類
Rectangle2 rec2 = new Rectangle2();
System.out.println("請輸入矩形的長度");
int m1 = scan.nextInt();
System.out.println("請輸入矩形的長度");
int n1 = scan.nextInt();
System.out.println(rec2.print(m1,n1));
}
}
class Parameter{
Boolean isWisdom = true;
public String name = "kenny";
protected int age = 20;
private double weight = 60.5;//一定要保持體重
public void work() {
System.out.println(name + "工作了一整天");
}
public void sleep(int hour) {
work();//方法內可以調用類中的方法與屬性,不需要實例化
System.out.println(name + "睡了" + hour + "小時");
//sleep(10); //會報錯,因爲這種遞歸無法結束,局部變量被重複創建,無法回收,棧空間很快溢出
}
public double getWeight() {
return weight;
}
public double setWeight(double i) {
System.out.println(name + "又胖了" + i + "Kg");
return weight += i;
}
}
class Person2{//同一個包內的類名不能重複?
String name;
int age;
char sex;
public void study(int hour) {
System.out.println(name + " has been studying for" + hour +"hours");
}
public void showAge() {
System.out.println(name + " is already" + age + "years old");
}
public int addAge(int i) {
age += i;
return age;
}
}
class Circle{
double radius;
public void setRadius(double i) {
radius = i;
}
public double area() {
return Math.PI * radius * radius ;
}
}
//方法可以不返回數值,直接在方法體內輸出面積
//class Circle{
// double radius;
// public void area() {
// double area = Math.PI * radius * radius ;
// System.out.println("圓的面積是" + area);
// }
//}
// 去掉setRadius方法也可以使用
// class Circle{
// double radius;
// public double area() {
// return Math.PI * radius * radius ;
// }
//}
// 可以單獨定義方法,不定義屬性,但半徑更適合當做屬性
//class Circle{
// public double area(double radius) {
// return Math.PI * radius * radius ;
// }
//}
class Rectangle{
int length = 10;
int width = 8;
public int print() {
for (int i = 0; i < length; i++) {
for (int j = 0; j < width; j++) {
System.out.print("* ");
}
System.out.println();
}
return length * width;//可以把計算面積與打印矩形放在一個方法內,但只返回面積值
}
}
class Rectangle1{
int length;
int width;
public void setLength(int m) {
length = m;
}
public void setWidth(int n) {
width = n;
}
public void print() {
for (int i = 0; i < length; i++) {
for (int j = 0; j < width; j++) {
System.out.print("* ");
}
System.out.println();
}
}
public int area() {
return length * width;
}
}
class Rectangle2{
public int print(int m,int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
System.out.print("* ");
}
System.out.println();
}
return m * n;
}
}