目錄
實例3:實現一個學生類,需要包含姓名、性別、學號和年齡等屬性
1. 配置java編譯環境
針對Windows64位:
鏈接:https://pan.baidu.com/s/1q7p6YbKSyxl4k90DEeBQVw
提取碼:fwmy
(1)安裝配置jdk
通過以下步驟配置PATH環境變量:
(2)下載、安裝IntelliJ IDEA
兩種模式下的視圖轉換:File — settings — color Scheme(Default與Darcula)
(3)建立java源代碼輸出“Hello World”
public class Hello {
public static void main(String[] args){
System.out.println("Hello World.");
}
}
Hello World.
Process finished with exit code 0
(4)通過命令提示窗口運行
- 命令javac和java都是JDK軟件包自帶的,通過javac命令產生一個.class文件。
2. java基本語法
(1)java程序的構成
- 邏輯構成
程序頭包的引用:主要引用JDK軟件包自帶的包,也可以是自己定義的類,引用之後程序體中就可以自由應用包中的類的方法與屬性。
類的定義:可以有多個類的定義,但必須有一個主類,這個主類是程序運行的路口點,在java源程序中,主類的名字同文件名一致。
- 物理構成
語句一行以分號結束。
括號{}界定語句序列。
空白指的是語句之間、塊內部、或者塊之間的空白行。
- 註釋語句
行註釋以//開始的行。
塊註釋以/*...*/開始和結束。
- 標識符、關鍵字和轉義符
標識符:
有字母、數字、下劃線(_)、美元符號組成,其中美元符號用的比較少。
標識符從一個字母、下劃線、美元符號開始。
java語言中對大小寫比較敏感。
標識符沒有最大長度限制。
標識符定義不能是關鍵字。
關鍵字:
java語言中自帶的用於標誌數據類型名(如:double)。
轉義符:
擁有特殊含義的字符見下表。
(2)數據類型
- java數據類型
- 整數類
採用三種進制:十六進制、八進制、十進制。
十進制:2
八進制:o45
十六進制:oxBACA
具有缺省int。
用字母L或l表示長整型。
所有java中編譯語言中的整數類型都是有符號的數字。
- 文本類
必須包含單引號引用的文字。
代表一個16 bit Unicode字符。
- 浮點類
默認類型爲double,有f和d兩種形式。
- 邏輯類
boolean數據類型有兩種:true和false
如:boolean f=true;
(3)變量與常量
- 常量:是指整個運行過程中不在發生改變的量。
- 變量:變量得聲明也指變量的創建。
(4)運算符和表達式
- 算術運算符
+(加)、-(減)、*(乘)、/(除)、%(取模運算)、++(增量運算符)、--(減量運算符)
- 關係運算符
==(等於)、!=(不等於)、>(大於)、<(小於)、>=(大於等於)、<=(小於等於)
- 布爾邏輯運算符
- 位運算符
~(位求反)、&(按位與)、|(按位或)、^(按位異或)、<<(左移)、>>(右移)、>>>(不帶符號右移)
- 賦值運算符
- 其它操作符及其表達式
三目運算符:(?:):
表達式:x?y:z;
判斷x是否爲真,如果爲真則選y,如果爲假則選z。
對象運算符:instanceof
- 優先級
3. 流程控制與數組
(1)if-else語句
if(布爾表達式)
{
語句塊1;
}
else
{
語句塊2;
}
布爾表達式:返回爲true時,執行語句1;返回爲false時,執行語句2;
(2)switch語句
switch(表達式1)
{
case 表達式2:
語句;
break;
case 表達式3:
語句;
break;
default:
語句;
break;
}
- 表達式1的值必須與整型兼容。
- break表示要跳出這一分支。
- case分支要執行程序語句。
(3)for循環語句
for(初始化表達式;測試表達式;步長){
語句;
}
- 首先運行初始化表達式。
- 然後計算測試表達式,爲真時,執行語句塊,如果爲假,結束for循環。
- 最後執行步長。
(4)while循環
while(布爾表達式){
語句;
}
布爾表達式爲true執行語句,否則跳出。
(5)do語句
do{
語句;
}while(布爾表達式);
(6)數組
- 首先是一個對象。
- 存放相同的數據類型。
- 所有數組下標默認值0開始,且訪問時候不可以超出定義上限。
- 聲明格式
數據類型 標識符[]
如:int tab[];聲明數據類型爲整型的數組tab。
- 創建數組
由於數組是一個對象,所以用關鍵字new來創建一個數組。
tab=new int[10]; 創建存儲10個整型數據的數組tab。
創建完成後,賦值:
- 每個元素賦值:tab[0]=1
tab[1]=3;
.......
tab[9]=9;
- 直接聲明的時候說明其值
int tab[]={1,2,3,4,5};
4. 類
(1)類的定義與聲明
- java編程是面向對象的,處理最小的完整單元爲對象。
- 類由類聲明和類體構成,類體又有變量和方法構成。
- 類聲明的基本格式
訪問說明符 class 類名 extends 超類名 implements 接口名
- 訪問說明符public或者省略。
- 類名:用戶自定義類名。
- 超類名:是指已經存在的類名。
- 接口名:接口
- 類體
成員變量格式:訪問說明符 數據類型 變量名
- 訪問說明符有:public、private、protected。
- public:省略時候默認的公有類型。可以由外部對象進行訪問。
- private:私有類型,只允許在類的內部的方法和使用,若從外部訪問,則需要建立函數,間接的訪問。
- protected:受保護類型,子類訪問受到控制。
方法:類的操作定義,標誌着類的動態特徵。
訪問說明符 數據類型 方法名(數據類型1 變量名1,數據類型2 變量名2)
- 使用new進行創建類
(2)類的單繼承性
java語言中允許用externs關鍵字從一個類擴展出一個新類,新類繼承超類的成員變量和方法,並且可以覆蓋。
(3)特殊變量
兩個特殊變量:super和this
- super
類聲明中用關鍵字extends擴展了其超類後,super用在擴展類中引用其它超類中的成員變量。
- this
指向當前變量或者實例。
(4)構造函數
類中的構造函數用來初始化一個類。
(5)包
聲明包的格式:Package 包名;
Package爲關鍵字,包名爲標識符。
Package語句要作爲程序非註釋語句的第一行。
包內的類名唯一。
引用包中類時,使用import語句。格式import 包名.類名
5. 集合類的使用
(1)List接口
- List接口
List接口擴展了Collection,可以包含重複元素。元素是有順序的,每個元素都有一個index值(從0開始)標明元素在列表中的位置。在聲明時可以帶有一個泛型參數,即List<E> 。實現List接口的主要類有Vector、ArrayList和LinkedList等。Vector和ArrayList以類似數組的形式進行存儲,因此它的隨機訪問速度極快。LinkedList的內部實現是鏈表,適合於在鏈表中間需要頻繁進行插入和刪除操作。
ArrayList/Vector常用方法:
- void add(Object obj) ,添加一個對象
- boolean addAll(Collection col),添加整個集合,如果接收者對象的結果有變化,則返回true
- int size() ,返回元素的個數。
- boolean isEmpty(),如果不含元素,則返回true
- Object get(int pos),返回指定位置的元素
- void set(int pos, Object obj),用參數對象替換指定位置的對象
- boolean remove(Object obj),去除給定對象的第一次出現,如果找到了對象,則返回true。去除一個對象後,其後面的所有對象都依次向前移動。
- Object remove(int pos),去除給定位置的元素,並返回被去除的對象
- boolean removeAll(Collection<?> col),從接收者對象中去除所有在參數對象中出現的元素,如果接收者對象的結果有變化,則返回true
- void clear() ,去除所有的元素
- boolean contains(Object obj),返回是否包含指定的對象,如果包含則返回true;否則,返回false
- boolean containsAll(Collection<?> col),返回是否包含參數col中的所有對象
- int indexOf(Object obj),返回給定對象在Vector /ArrayList中第一次出現的位置,如不存在,則返回-1
(2)Set接口
- Set接口
Set接口擴展了Collection接口,禁止重複的元素,是數學中“集合”的抽象。實現它的兩個主要類是哈希集合(HashSet)及樹集合(TreeSet)。
(3)Map接口
- Map接口
Map用於存儲“關鍵字”(key)和“值”(value)的元素對,其中每個鍵映射到一個值,當需要通過關鍵字實現對值的快速存取時使用。兩個主要實現類:TreeMap、HashMap。
Map接口常用方法:
- int size(),返回Map中的元素個數
- boolean isEmpty(),返回Map中是否包含元素,如不包括任何元素,則返回true
- boolean containsKey(Object key),判斷給定的參數是否是Map中的一個關鍵字(key)
- boolean containsValue(Object val),判斷給定的參數是否是Map中的一個值(value)
- Object get(Object key),返回Map中與給定關鍵字相關聯的值(value)
- Collection values(),返回包含Map中所有值(value)的Collection對象
- Set keySet(),返回包含Map中所有關鍵字(key)的Set對象
- Set entrySet(),返回包含Map中所有項的Set對象
- Object put(Object key, Object val),將給定的關鍵字(key)/值(value)對加入到Map對象中。其中關鍵字(key)必須唯一,否則,新加入的值會取代Map對象中已有的值
- void putAll(Map m),將給定的參數Map中的所有項加入到接收者Map對象中
- Object remove(Object key),將關鍵字爲給定參數的項從Map對象中刪除
- void clear(),從Map對象中刪除所有的項
(4)Iterator接口
- Iterator接口
Iterator接口是一個遍歷集合元素的工具,並具有從正在遍歷的集合中去除對象的能力。具有如下三個實例方法,
- hasNext(),判斷是否還有元素
- next(),取得下一個元素
- remove(),去除一個元素。注意是從集合中去除最後調用next()返回的元素,而不是從Iterator類中去除
(5)Collections類
- Collections類
Collections類提供了對集合的操作,包括
- 排序算法sort
對List重新排序,使其中的元素按照某種次序關係升序排列。有兩種形式,簡單形式只是將元素按照自然次序排列,第二種形式需要一個附加的Comparator對象作爲參數,用於規定比較規則,可用於實現反序或特殊次序排序。
- 洗牌算法shuffle
其作用與排序算法恰好相反,它打亂List中的任何次序。也就是說以隨機方式重排元素,任何次序出現的機率都是相等的。在實現偶然性遊戲的時候,這個算法很有用。
- reverse:將一個List中的元素反向排列
- fill:用指定的值覆寫List中的每一個元素,這個操作在重新初始化List時有用
copy:接受兩個參數,目標List和源List,將源中的元素複製到目標,覆寫其中的內容。目標List必須至少與源一樣長,如果更長,則多餘的部分內容不受影響。
實例1:使用switch結構計算每個月的天數(考慮閏年)
(1)解析
閏年是可以整除4,但不可以整除100的數,或者直接可以整除400。
java.util.Scanner是Java5的新特徵,主要功能是簡化文本掃描、獲取控制檯輸入。
通過new Scanner(Sysem.in)創建一個Scanner,控制檯會一直等待輸入,直到敲回車結束,把所輸入的內容傳給Scanner,作爲掃描對象。
next() 每次取到一個間隔符前面的數據。
nextInt() 是取next() 然後把字符串解析成一個int數字。
英語:閏年(Leap year)
(2)代碼實現
import java.util.Scanner;
public class test {
//判斷是否爲閏年
public static boolean isLeapyear(int year){
return((year%4==0)&&(year%100!=0)||(year%400==0));
}
//輸出具體年份月份的天數
public static int days(int year,int month){
int day;
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
day=31;
break;
case 2:day=isLeapyear(year)?29:28;
break;
default:
day=30;
break;
}
return day;
}
//程序執行開始
public static void main(String[] args){
int year,month;
Scanner s=new Scanner(System.in);
System.out.print("請輸入年份:");
year=s.nextInt();
System.out.print("請輸入月份:");
month=s.nextInt();
System.out.print(year+"年"+month+"月的天數是"+(days(year,month)));
}
}
(3)結果展示
請輸入年份:2020
請輸入月份:4
2020年4月的天數是30
Process finished with exit code 0
實例2:找到1000以內所有的素數,並且保存到數組中去
(1)解析
質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數,質數也稱爲素數。通過循環遍歷2至n/2,若中間的任意一個數能被n整除,則n不是質數,返回false;若所有的數均不能被n整除,則返回true。
英語:素數(prime)
(2)代碼實現
public class text1 {
//判斷給定的數是不是素數
public static boolean isprime(int n){
int i;
for(i=2;i<=n/2;i++){
if((n%i)==0){
return false;
}
}
return true;
}
public static void main(String[] args){
int[] primes=new int[1000];
int i,count=0,j;
for(i=2;i<=1000;i++){
if(isprime(i))
{
primes[count]=i;
count++;
}
}
for(j=0;j<count;j++){
System.out.println(primes[j]);
}
}
}
實例3:實現一個學生類,需要包含姓名、性別、學號和年齡等屬性
(1)題目要求
題目:實現一個學生類,需要包含姓名、性別、學號和年齡等屬性。要求:
- 無參數和有參數的構造函數
- 各個屬性(不包括學號)的set和get方法
- 使用類變量實現學號的自增
- 使用枚舉類型表示性別
- 實現toString()方法
- 編寫main函數進行測試
(2)代碼實現
枚舉類型:Gender.java
public enum Gender {
MALE,
FEMALE
}
實現要求:Student.java
public class Student {
private String name;
private int no;
private int age;
private Gender g;
private static int count=0;
public String getName(){
return name;
}
public String setName(String name){
return this.name=name;
}
public int getAge(){
return age;
}
public int setAgeint (int age){
return this.age=age;
}
public Gender getG(){
return g;
}
public void setG(Gender g){
this.g=g;
}
public int getNo(){
return no;
}
Student(String name,int age,Gender g){
this.name=name;
this.age=age;
this.g=g;
count++;
no=count;
}
Student(){
this("",18,Gender.MALE);
}
public String toString(){
return name+","+g+","+age+","+no;
}
}
測試代碼:text.java
public class text {
public static void main(String[] args){
Student s1=new Student("zhang san",20,Gender.MALE);
Student s2=new Student("li hong",21,Gender.FEMALE);
Student s3=new Student("wang ming",23,Gender.MALE);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}
運行結果:
zhang san,MALE,20,1
li hong,FEMALE,21,2
wang ming,MALE,23,3
Process finished with exit code 0
實例4:抽象類的繼承
(1)題目
題目:抽象類的繼承
- 編寫抽象類Shape,包含抽象方法void draw()。
- 從類Shape派生兩個類Rectangle和Circle。
- 在main函數中分別實例化Rectangle和Circle的對象,賦值給Shape類的引用變量,並調用其draw方法。
(2)實現過程
- 新建一個工程,命名爲Shape。
- 在工程中新建一個類,命名爲Shape,Shape類爲抽象類,包含抽象方法draw,實現代碼爲:
public abstract class Shape {
abstract void draw();
}
- 新建Rectangle類,從Shape類派生並實現抽象方法draw,實現代碼爲:
public class Rectangle extends Shape {
void draw(){
System.out.println("Draw rectangle.");
}
}
- 新建Circle類,從Shape類派生並實現抽象方法draw,實現代碼爲:
public class Circle extends Shape {
void draw(){
System.out.println("Draw circle.");
}
}
- 新建ShapeTester類,此類是本工程的主類,包含程序入口函數main,實現代碼爲:
public class ShapeTester {
public static void main(String[] args){
Shape s=new Rectangle();
s.draw();
Shape r=new Circle();
r.draw();
}
}
(3)結果顯示
Draw rectangle.
Draw circle.
Process finished with exit code 0