1. 程式人生 > >Java程式設計(Java9版):第6章 類與物件

Java程式設計(Java9版):第6章 類與物件

6.1類與物件的定義

6.1.1 類的定義

jshell> class Person {
   ...>  //屬性
   ...>  public String name;        //姓名
   ...>  public char   sex;         //性別
   ...>  public int    age;         //年齡
   ...>  //方法
   ...>  public void speak(){       //說話
   ...>          System.out.println("姓名:"+name+",性別:"+sex+",年齡:"+age);
   ...>  }
   ...> }
|  已建立 類 Person

6.1.2 建立物件

jshell> Person p=new Person();   //定義物件
p ==> [email protected]

jshell> p.name="張三";           //訪問屬性
$34 ==> "張三"

jshell> p.sex='女';
$35 ==> '女'

jshell> p.age=20;
$36 ==> 20

jshell> p.speak();                //訪問方法
姓名:張三,性別:女,年齡:20

jshell>

建立多個物件

jshell> Person q=new Person();   //定義物件
q ==> 
[email protected]
jshell> q.name="李四"; //訪問屬性 $39 ==> "李四" jshell> q.sex='男'; $40 ==> '男' jshell> q.age=21; $41 ==> 21 jshell> q.speak(); //訪問方法 姓名:李四,性別:男,年齡:21 jshell>

物件引用的傳遞

jshell> p=new Person();   //定義物件
p ==> [email protected]
jshell> p.name="王五"; //訪問屬性 $44 ==> "王五" jshell> p.sex='男'; $45 ==> '男' jshell> p.age=19; $46 ==> 19 jshell> p.speak(); //訪問方法 姓名:王五,性別:男,年齡:19 jshell>

6.2 封裝性

6.2.1 存在問題

jshell> p.sex='女';
$48 ==> '女'

jshell> p.speak();
姓名:王五,性別:女,年齡:19

6.2.2 private屬性

jshell> class Person {
   ...>  //屬性
   ...>  private String name;        //姓名
   ...>  private char   sex;         //性別
   ...>  private int    age;         //年齡
   ...>  //方法
   ...>  public void speak(){       //說話
   ...>          System.out.println("姓名:"+name+",性別:"+sex+",年齡:"+age)
;
   ...>  }
   ...> }
|  已替換 類 Person
|    更新已替換 變數 q, 重置為空值
|    更新已替換 變數 p, 重置為空值

jshell>
jshell> p.sex='女';
|  錯誤:
|  sex 在 Person 中是 private 訪問控制
|  p.sex='女';
|  ^---^

jshell>

6.2.3 訪問控制

jshell> class Person {
   ...>  //屬性
   ...>  private String name;        //姓名
   ...>  private char   sex;         //性別
   ...>  private int    age;         //年齡
   ...>  //普通方法
   ...>  public void speak(){       //說話
   ...>          System.out.println("姓名:"+name+",性別:"+sex+",年齡:"+age)
;
   ...>  }
   ...>  //以下是訪問控制方法
   ...>  public String getName() {
   ...>          return name;
   ...>  }
   ...>  public void setName(String name) {
   ...>          this.name = name;
   ...>  }
   ...>  public char getSex() {
   ...>          return sex;
   ...>  }
   ...>  public void setSex(char sex) {
   ...>          this.sex = sex;
   ...>  }
   ...>  public int getAge() {
   ...>          return age;
   ...>  }
   ...>  public void setAge(int age) {  //寫年齡控制
   ...>          if(age>=1&&age<=120)
   ...>                  this.age = age;
   ...>          else
   ...>                  System.out.println("age引數有誤");
   ...>  }
   ...> }
|  已替換 類 Person
|    更新已替換 變數 q, 重置為空值
|    更新已替換 變數 p, 重置為空值

jshell>

正常訪問

jshell> Person p=new Person();
p ==> [email protected]

jshell> p.setName("張三");

jshell> p.setSex('女');

jshell> p.setAge(20);

jshell> p.speak();
姓名:張三,性別:女,年齡:20

jshell>
jshell> p.setAge(500);
age引數有誤

jshell> p.speak();
姓名:張三,性別:女,年齡:20

jshell>

6.3 構造器

jshell> class Person {
   ...>  //屬性
   ...>  private String name;        //姓名
   ...>  private char   sex;         //性別
   ...>  private int    age;         //年齡
   ...>  //構造器
   ...>  public Person(){
   ...>          System.out.println("預設無參構造器被呼叫!");
   ...>  }
   ...>  public Person(String name,char sex,int age){
   ...>          System.out.println("有參構造器被呼叫!");
   ...>          this.name=name;
   ...>          this.sex=sex;
   ...>          this.age=age;
   ...>  }
   ...>
   ...>  //普通方法
   ...>  public void speak(){       //說話
   ...>          System.out.println("姓名:"+name+",性別:"+sex+",年齡:"+age
);
   ...>  }
   ...>  //以下是訪問控制方法
   ...>  public String getName() {
   ...>          return name;
   ...>  }
   ...>  public void setName(String name) {
   ...>          this.name = name;
   ...>  }
   ...>  public char getSex() {
   ...>          return sex;
   ...>  }
   ...>  public void setSex(char sex) {
   ...>          this.sex = sex;
   ...>  }
   ...>  public int getAge() {
   ...>          return age;
   ...>  }
   ...>  public void setAge(int age) {  //寫年齡控制
   ...>          if(age>=1&&age<=120)
   ...>                  this.age = age;
   ...>          else
   ...>                  System.out.println("age引數有誤");
   ...>  }
   ...> }
|  已替換 類 Person
|    更新已替換 變數 q, 重置為空值
|    更新已替換 變數 p, 重置為空值

jshell>
jshell> Person p=new Person();
預設無參構造器被呼叫!
p ==> [email protected]

jshell> Person q=new Person("劉六",'女',22);
有參構造器被呼叫!
q ==> [email protected]

jshell> q.speak();
姓名:劉六,性別:女,年齡:22

jshell>

6.4 匿名物件

jshell> new Person("匿名物件",'男',18).speak();
有參構造器被呼叫!
姓名:匿名物件,性別:男,年齡:18

jshell>

6.5 JavaBean

jshell> class Point{
   ...>        private double x;
   ...>        private double y;
   ...>        public Point(){}
   ...>        public Point(double x,double y){
   ...>             this.x=x;
   ...>             this.y=y;
   ...>        }
   ...>        public double distance(Point p){
   ...>             double d=(this.y-p.getY())*(this.y-p.getY());
   ...>             d=d+(this.x-p.getX())*(this.x-p.getX());
   ...>             d=Math.sqrt(d);
   ...>             return d;
   ...>       }
   ...>  	  public double getX() {
   ...>          return x;
   ...>       }
   ...>       public void setX(double x) {
   ...>          this.x = x;
   ...>      }
   ...>   	  public double getY() {
   ...>          return y;
   ...>   	  }
   ...>   	  public void setY(double y) {
   ...>          this.y = y;
   ...>  	  }
   ...> }
|  已建立 類 Point

jshell> Point p=new Point();
p ==> [email protected]

jshell> p.setX(0)

jshell> p.setY(0)

jshell> Point q=new Point(1,1);
q ==> [email protected]

jshell> p.distance(q)
$14 ==> 1.4142135623730951

jshell>

jshell>

6.6 方法過載

jshell> class Maths{
   ...>     //計算圓的面積
   ...>  public double area(double r){
   ...>         return 3.14*r*r;
   ...>     }
   ...>     //計算橢圓的面積
   ...>  public double area(double a, double b){
   ...>         return 3.14*a*b;
   ...>     }
   ...> }
|  已建立 類 Maths

jshell> new Maths().area(1);
$65 ==> 3.14

jshell> new Maths().area(2,3);
$66 ==> 18.84

jshell>

6.7 靜態成員

jshell> class Maths{
   ...>     //計算圓的面積
   ...>  public static double area(double r){
   ...>         return 3.14*r*r;
   ...>     }
   ...>     //計算橢圓的面積
   ...>  public static double area(double a, double b){
   ...>         return 3.14*a*b;
   ...>     }
   ...> }
|  已替換 類 Maths

jshell> Maths.area(1);
$68 ==> 3.14

jshell> Maths.area(2,3);
$69 ==> 18.84

jshell>

6.8 包

預設情況下,JShell提供了一些常用包的匯入
可以輸入以下命令列出所有匯入的包:

jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*

jshell>