1. 類
類主要包含3個部分:
- 類屬性:用來描述類本身所抽象出的事物的屬性
- 類方法:用來描述這個被抽象出的事物可以做什么
- 構造方法:每個類都至少會有一個特殊的方法,該方法提供了創建類對象的初始化機制
類的定義:
【修飾符】 class 類名 【extends 父類名】 【implements 接口名】
{
類成員變量的聲明;
類方法聲明;
}
.java源文件結構:
Java程序的源文件是一個以“.java”結尾的文件,同時該文件中只能有一個類被聲明為public類,若存在被聲明為public的類時,類的名字必須與“.java”源文件名相同。
在一個源文件中,可以包含三種頂層元素:package(包聲明)、import(類庫導入語句)、class(類聲明)。如果同時出現,必須按照package、import、class的順序出現。
main()入口方法:
public static void main(String argv[]) {}
main()方法中的字符串數組arvg[]是用來從命令行接收用戶參數的。
采用命令行執行Java程序的語句由四個部分組成:命令名,命令參數(是可選的),應用程序的名稱(即源文件中的主類類名),用戶輸入的參數(多個參數之間用空格分隔)
訪問修飾符public、private、protect、default
- public:可以跨類訪問,而且可以跨包訪問
- private:訪問權限限制最窄的修飾符。只能被該類的對象訪問,其子類不能訪問,更不允許跨包訪問
- proctet:能被類本身的方法及子類方法訪問,即使子類在不同的包中也可以訪問
- default:只允許在同一個包中進行訪問
構造方法:
構造方法的名字和類的名字是相同的,並且沒有任何類型的返回值,在構造方法前,只可以使用訪問修飾符public,private及protected。
如果一個類中沒有定義類的構造方法,系統會自動為這個類創建一個缺省的默認構造器,該構造器參數及方法均為空。
參數的傳遞:
傳遞的參數共有如下兩種:
- 基本類型參數所傳遞的都是基本數據類型,包括數值型、布爾型等。在這種情況下所有的參數傳遞都采用值傳遞的方式。也就是說,當傳遞一個參數到方法中時,方法獲得的只是該參數值的一個拷貝。因此,方法不會改變參數變量的值,只會使用該變量的值。
-
public class Example1 { public static void add(int a, int b) { int c=a+b; System.out.println("c="+c); a=c; } public static void main(String[] args) { int a=10; int b=20; add(a,b); System.out.println("a="+a); } }
c=30
a=10
-
- 對象引用型參數,方法中獲得的是該對象的內存地址,因此方法可以改變該對象中的屬性,但是不能改變對象本身。
-
public class Example2 { public static void change(String str, char ch[]) { str="Changed"; ch[0]='C'; } public static void main(String[] args) { String s=new String("World"); char ch[]={'H','e','l','l','o'}; change(s,ch); System.out.println(s+ " and "+ String.valueOf(ch)); } }
World and Cello
成員方法重載與過載:
- Overriding:是面向對象語言的特性,只存在於父類和子類之間。當父類中的一個方法在繼承它的子類中重新獲得定義時,若該方法的方法名、參數、返回值類型均不變,只有方法體發生了變化時,就稱子類的方法重載了父類的方法。
- Overloading,是編程語言均有的特性,與面向對象無關,存在於同一個類中。指的是多個方法擁有同一個名字,每個方法都有一套唯一的、不同於其他同名方法的參數列表。
-
public class Example { int a=10; int b=20; int c=30; public Example() { System.out.println("a+b="+add(a,b)); System.out.println("a+b+c="+add(a,b,c)); } public int add(int x, int y) { return x+y; } public int add(int x, int y, int z) { return x+y+z; } public static void main(String[] args) { new Example(); } }a+b=30
a+b+c=60
static靜態成員:
static關鍵字可以用來修飾成員變量、方法以及代碼模塊。使用static修飾過的變量、方法都稱之為靜態成員。靜態成員附屬於類本身,而不附屬於類的成員變量。
需要注意的是,靜態方法中不能直接訪問非靜態的成員變量。
public class StaticExample1 { static int num=10; public static void main(String[] args) { System.out.println(StaticExample1.num); } }
public class StaticExample2 { public static void showString() { System.out.println("This is a static method."); } public static void main(String[] args) { //不創建類的情況下,直接調用類中的靜態方法 StaticExample2.showString(); } }
final關鍵字:
final關鍵字可以用於類、方法、變量前,用來表示該關鍵字所修飾的類、方法、變量具有不可變的特性。
- final關鍵字用於基本數據類型變量前,這時表面該關鍵字修飾的變量是一個常量,在定義后,該變量的值就不能再被改變,同時在定義時必須被初始化
- final關鍵字用於方法聲明前,被final修飾的方法被稱為最終方法,該方法只能被調用,不能被重載,但是可以被過載
- final關鍵字用於類名前,final關鍵字修飾的類被稱為最終類,該類不能被其他類繼承
public class FinalExample { static final double pie=3.14; public static void circularityArea(String r) { double radius=Double.valueOf(r).doubleValue(); System.out.println("The circularity's area is: "+ pie*radius*radius); } public static void circularityPerimeter(String r) { double radius=Double.valueOf(r).doubleValue(); System.out.println("The circularity's area is: "+ pie*radius*2); } public static void main(String[] args) { if(args.length!=1) { System.out.println("Error!"); System.exit(0); } System.out.println("The circularity's radius is: "+args[0]); circularityArea(args[0]); circularityPerimeter(args[0]); } }
判斷對象所屬類:
- 獲取對象所屬類的名字:String name = 對象名.getClass().getName();
- 使用instanceof運算符的語法格式: boolean bool = 對象名 instanceof 類名;
實戰練習:
簡單模擬一個商店客戶折扣卡的功能,自定義Customer類用來保存某個商店中的客戶的折扣卡信息。在主類CustomerDemo中,創建Customer類的一個數組對象,該數據對象中包含了3個Customer對象,用來保存3個不同的消費者各自持有的折扣卡信息。通過這3個對象,可以根據用戶消費的金額來改變用戶在本店中所能享受的折扣價格。
public class CustomerDemo { Customer customer[] = new Customer[3]; public CustomerDemo() { customer[0]=new Customer("c001", "wangxyw","BeiJing","wangxyue@cn.ibm.com"); customer[1]=new Customer("c002", "Xu Quan", "ShangHai", "chunticha@yahoo,com"); customer[2]=new Customer("c003", "Xu Guang Yang", "BeiJing", "xugy@hotmail.com"); customer[0].buy(2800.00); customer[0].setDiscount(); customer[1].buy(1688.00); customer[1].setDiscount(); customer[2].buy(980.00); customer[2].setDiscount(); for(int i=0; i<customer.length;i++) { System.out.println("customer[" + i + "]"); System.out.println("CardID: "+customer[i].getCardID()); System.out.println("name: "+ customer[i].getName()); System.out.println("cost: "+ customer[i].getCost()); System.out.println("discount: "+ customer[i].getDiscount()*10); System.out.println("address:" + customer[i].getAddress()); System.out.println("email:" + customer[i].getEmail()+ "\n"); } } public static void main(String[] args) { new CustomerDemo(); } } class Customer{ private String cardID; private String name; private double cost=0; private String address; private String email; private double discount = 1; public Customer(String id, String name, String add, String email) { cardID=id; this.name=name; address=add; this.email=email; } //用於購買商品后,增加用戶消費值 public void buy(double cost) { this.cost+=cost; } //根據用戶的消費額度來改變用戶所能享受的折扣 public void setDiscount() { if(cost>2000.00) discount-=0.1; else if(cost>1000.00) discount-=0.05; } //用於獲取和設置用戶地址的方法 public String getAddress() { return address; } public void setAddress(String address) { this.address=address; } //用於獲取和設置用戶卡號的方法 public String getCardID() { return cardID; } public void setCardID(String cardID) { this.cardID=cardID; } //用於獲取用戶消費金額的方法 public double getCost() { return cost; } //用於獲取用戶的折扣值得方法 public double getDiscount() { return discount; } //用於獲取和設置用戶信箱地址的方法 public String getEmail() { return email; } public void setEmail(String email) { this.email=email; } //用於獲取和設置用戶名的方法 public String getName() { return name; } public void setName(String name) { this.name=name; } }
customer[0]
CardID: c001
name: wangxyw
cost: 2800.0
discount: 9.0
address:BeiJing
email:wangxyue@cn.ibm.com
customer[1]
CardID: c002
name: Xu Quan
cost: 1688.0
discount: 9.5
address:ShangHai
email:chunticha@yahoo,com
customer[2]
CardID: c003
name: Xu Guang Yang
cost: 980.0
discount: 10.0
address:BeiJing
email:xugy@hotmail.com
