Java程式設計(Java9版):第6章 類與物件
阿新 • • 發佈:2019-01-03
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>