第6章面向對象基礎(6)

重點掌握

1、類的定義

訪問權限控制符

? ? ? ? ? ? ? ? ? ? ? ? ?public? ? ? protected? ? ?default? ? ??private?

同一個類? ? ? ? ? ?可? ? ? ? ? ? ? ? ?可? ? ? ? ? ? ? ??可? ? ? ? ? ?可

同一個包? ? ? ? ? ? 可? ? ? ? ? ? ? ??可? ? ? ? ? ? ? ??可? ? ? ? ? ?

不同包但繼承? ? ?可? ? ? ? ? ? ? ??可

全局? ? ? ? ? ? ? ? ? ? 可

static 修飾符

如果一個類用static修飾,表示他是靜態的

static可以用來修飾類的成員方法、類的成員變量,代碼塊



一、實體類創建

第一種方式:無參構造+get/set

package com.neuedu.test.chap06;

public class XiYouJi {

//姓名

private String name;

//戰斗力

private int sword;

//耐力

private int endurance;

//武器

private String arms;

? ? //年令

private int age;

public XiYouJi() {

super();

System.out.println("無參構造方法被調用");

}



public String getMingzi() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getSword() {

return sword;

}

public void setSword(int sword) {

this.sword = sword;

}

public int getEndurance() {

return endurance;

}

public void setEndurance(int endurance) {

this.endurance = endurance;

}

public String getArms() {

return arms;

}

public void setArms(String arms) {

this.arms = arms;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}


注意:方法調用:

實例化對象

類名??對象名= new?? 類名();

public static void main(String[] args) {

//創建對象一般有兩種方式

//第一種 清水房+逐步采購? 無參構造+各個屬性的set方法? =》各個屬性的設置

//缺點:逐步構建 代碼不夠簡潔

//優點:修改不會影響原有代碼

//適用于屬性經常變動的

XiYouJi swk = new XiYouJi();

swk.setName("孫悟空");

swk.setSword(5);

swk.setEndurance(5);

swk.setArms("金箍棒");

swk.setAge(18);

XiYouJi ts = new XiYouJi();

ts.setName("唐僧");

ts.setSword(0);

ts.setEndurance(5);

XiYouJi zbj = new XiYouJi();

zbj.setName("豬八戒");

zbj.setSword(2);

zbj.setEndurance(4);

swk.setArms("耙子");

}

}

構造方法

用來創建對象

特點:1)方法名與類名相同

2)沒有返回值 類型,并且沒有void占位

3)不需要return

分類:

分為無參構造和有參構造

如果我們實例化對象時如下寫:

類名? 對象名=new 類名();? 實際調用的是無參構造方法

如果你不寫無參構造 ,系統會為你自動生成一個。如果你寫了,就會調用你新寫的這個。

構造方法的重載

有參構造可以限制參數個數,通過重載實現

有參構造無參構造屬于方法重載

學生試驗:

把類的無參方法注釋掉,看發生什么現象

發現調用無參構造方法的地方報錯。

結論:

如果你在類中寫了有參構造,那么系統不會再幫你生成無參構造了,你如果還想用無參構造 ,就需要重載一下無參構造方法。

無參構造:

創建方式:右鍵-source-generate constructor from superclass

public XiYouJi() {

super();

System.out.println("無參構造方法被調用");

}

XiYouJi swk = new XiYouJi();

debug測試一下

學生練習:無參方法創建對象和對象賦值

有參構造:

創建方式:右鍵-source-generate constructor using fields

系統生成代碼如下:

//有參構造-經常用來一次性初始化參數

public XiYouJi(String name, int sword, int endurance, String arms, int age) {

super();

this.name = name;

this.sword = sword;

this.endurance = endurance;

this.arms = arms;

this.age = age;

}

調用方式:

@Test

public? void test2() {

//精裝房 拎包入住 有參構造 -創建同時把各個屬性初始化

//有參構造如何編寫

//優點:一次性構建,方便,代碼簡潔

//缺點:修改麻煩

//適用于屬性不經常變動的情況

XiYouJi swk2 = new XiYouJi("孫悟空", 5, 5, "金箍棒",18);

System.out.println(swk2.sword);

}

學生練習:

練習有參方法創建對象和為對象賦值

注意:

一旦編寫了有參構造,系統不會再為我們生成無參構造,如果想用無參構造,需要顯式編寫

其他方法的創建:

除了構造方法外,很多時候我們還需要編寫自己的業務方法。這些方法用于做業務。

課堂簡單演示:

1)編寫一個商品的類,要求包含商品名稱和商品價格,并且編寫一個方法能夠在控制臺輸出“商品名:價格”。并在主函數中調用

輸出示例:

可樂:2.5

鼠標:50


package com.neuedu.test.chap06;

/**

* 1)編寫一個商品的類,

* 要求包含商品名稱和商品價格,

* 并且編寫一個方法能夠在控制臺輸出“商品名:價格”。

* 并在主函數中調用

* @author Administrator

*

*/

public class Product {

//商品名稱

private String proName;

//商品價格

private double proPrice;

//編寫一個方法能夠在控制臺輸出“商品名:價格”。

public? void printDetail(){

System.out.println(this.proName+":"+this.proPrice);

}

public Product(String proName, double proPrice) {

super();

this.proName = proName;

this.proPrice = proPrice;

}

//并在主函數中調用

/*輸出示例:

可樂:2.5

鼠標:50*/

public String getProName() {

return proName;

}

public double getProPrice() {

return proPrice;

}

public static void main(String[] args) {

//實例化一個可樂商品

Product keli=new Product("可樂",2.5);

//調用可樂的方法打印可樂的詳情

keli.printDetail();

Product mouse=new Product("鼠標",50);

mouse.printDetail();

}

}

上面都演示的無返回值類型的方法,下面學習有返回值類型的方法

課堂練習,作業題2

定義一個矩形類Rectangle:

2.1? 有2個屬性:長length、寬width

2.2? 通過構造方法Rectangle(int width, int length),分別給兩個屬性賦值

2.3? 定義三個方法:getArea()求面積、getPer()求周長,showAll()分別在控制臺輸出長、寬、面積、周長。

2.4? 創建一個Rectangle對象,并輸出相關信息

public class Rectangle {

//長

private double length;

//寬

private double width;

public Rectangle(double length, double width) {

super();

this.length = length;

this.width = width;

}

/**

* getArea()求面積

*/

public double getArea(){

double area=length*width;

return area;

}

? /**

? ? * getPer()求周長

? ? */

public double getPer(){

double girth=(this.length+this.width)*2;

return girth;

}

/**

* showAll()分別在控制臺輸出長、寬、面積、周長。

*/

public void showAll(){

System.out.println("長"+length);

System.out.println("寬"+width);

double result=getArea();

System.out.println("面積"+result);

double result2=getPer();

System.out.println("周長"+result2);

}

public static void main(String[] args) {

Rectangle rc=new Rectangle(13.4,5);

rc.showAll();

}

}

java 面向對象三大特征:

封裝? 繼承 多態

封裝

所謂封裝是把對象的屬性和行為結合在一個獨立的系統單位內部

盡可能隱蔽對象的內部細節,只向外部提供接口

繼承(inheritance):

也稱泛化,繼承性是子類自動共享父類屬性和方法的機制,在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,并加入自己若干新的內容

多態(polymorphism):

指同一個命名可具有不同的語義

OO方法中,常指在一般類中定義的屬性或方法被特殊類繼承之后,可以具有不同的數據類型或表現出不同的行為,對于子類,可用不同的方法替代實現父類的服務的方法

static關鍵字

可以修飾的元素

屬性

注意:只能修飾屬性,不能修飾局部變量。

方法

代碼塊

static修飾屬性

所有對象共享,稱為靜態變量或類變量

不用static修飾的屬性稱為實例變量

static修飾方法

不需要實例化,可以直接訪問,稱為靜態方法或類方法

static修飾語句塊

類中由static關鍵字修飾的,不包含在任何方法體中的代碼塊,稱為靜態代碼塊

*static修飾的屬性、方法和代碼塊的特點

****用static修飾的屬性

它們在類被載入時創建,只要類存在,static變量就存在。

靜態變量和非靜態變量的區別是:靜態變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類初次加載時會被初始化。而非靜態變量是對象所擁有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

直接訪問:類名.屬性

靜態方法

靜態方法不需要實例化,可以直接訪問,訪問方式:

直接訪問:類名.方法名()

實例化后訪問:對象名.方法名() (不建議使用)

靜態語句塊

一個類中由static關鍵字修飾的,不包含在任何方法體中的代碼塊

當類被載入時,靜態代碼塊被執行,且只被執行一次

靜態塊經常用來進行類屬性的初始化

用static修飾的方法和不用static修飾的方法調用上的區別:

package com.neuedu.test.chap06;

import java.util.UUID;

public class StaticDemo {

//網站訪問計數器

//如果要把他變成共享計數器 他的值會動態變化

public static int count;

// 用static修飾的方法是靜態方法

public static String uudiUtil() {

// uuid生成器

return UUID.randomUUID().toString();

}

public StaticDemo() {

super();

System.out.println("構造方法被調用");

}

//在類實例化時就調用

//會在所有方法(包括構造方法)執行前被調用

//他適合做一些基本初始化(準備)工作

static{

System.out.println("我先被調用!");

}

public void print(){

System.out.println("print");

}

}

不用static修飾的方法調用是用:

第一步:把類實例化成對象

第二步:調用對象的方法


作業:

本章課后作業

選做題1

1)設計一個類Student,該類包括姓名、學號和成績。

2)設計一個方法,按照成績從高到低的順序輸出姓名、學號和成績信息。

public class Student {

/*

* 1)設計一個類Student,該類包括姓名、學號和成績。

* 2)設計一個方法,按照成績從高到低的順序輸出姓名、學號和成績信息。

*/

private String name;

private int id;

private int score;

public Student() {

super();

// TODO Auto-generated constructor stub

}

public Student(String name, int id, int score) {

super();

this.name = name;

this.id = id;

this.score = score;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getScore() {

return score;

}

public void setScore(int score) {

this.score = score;

}

//把成績亂序的數組轉化成按成績排序的數組

public void sortByScore(Student[] studs){

for(int i=1;i<studs.length;i++){

? for(int j=0;j<studs.length-i;j++){

? if(studs[j].getScore()<studs[j+1].getScore()){

? Student temp=studs[j];

? studs[j]=studs[j+1];

? studs[j+1]=temp;

? }

? }

}

}

public static void main(String[] args) {

Student s1=new Student("顧俊寧",100,84);

Student s2=new Student("李洋",101,94);

Student s3=new Student("王琦舒",102,66);

Student s4=new Student("高榮斌",104,82);

Student s5=new Student("劉元昊",105,98);

//System.out.println("s1---->"+s1);

//把上面四個學生放數組里

Student[] students=new Student[]{s1,s2,s3,s4,s5};

Student s=new Student();

s.sortByScore(students);

for(Student stu:students){

System.out.println(stu.getName());

System.out.println(stu.getScore());

System.out.println("----------->");

}

}

}

選做題

2、定義一個汽車類Vehicle,要求如下:[選做題]

2.1屬性包括:汽車品牌brand(String類型)、顏色color(String類型)和速度speed(double類型),并且所有屬性為私有。

2.2至少提供一個有參的構造方法(要求品牌和顏色可以初始化為任意值,但速度的初始值必須為0)。

2.3為私有屬性提供訪問器方法。注意:汽車品牌一旦初始化之后不能修改。

2.4定義一個一般方法run(),用打印語句描述汽車奔跑的功能

2.5定義測試類VehicleTest,在其main方法中創建一個品牌為“benz”、顏色為“black”的汽車。

package com.neuedu.chap06.homework;

public class Vehicle {

private String brand;

private String color;

private double speed=0;

public Vehicle(String brand, String color) {

super();

this.brand = brand;

this.color = color;

this.speed = 0;

}

public String getBrand() {

return brand;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public double getSpeed() {

return speed;

}

public void setSpeed(double speed) {

this.speed = speed;

}

public static void main(String[] args) {

Vehicle y=new Vehicle("benz","black");

y.run();

}

public void run(){

System.out.println("顏色為:"+color+brand+"以"+speed+"的速度奔跑");

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • DAY 05 1、 public classArrayDemo { public static void mai...
    周書達閱讀 751評論 0 0
  • Java OOP 什么是面向對象思想? 把一組數據和處理他們的方法組成對象(object),把相同行為的對象歸納為...
    chonglingliu閱讀 798評論 0 1
  • 課程地址:Java基礎之 — 反射(非常重要) (使用的前提條件:必須先得到代表的字節碼的Class,Cla...
    叨唧唧的閱讀 700評論 0 2
  • 定義一個點類Point,包含2個成員變量x、y分別表示x和y坐標,2個構造器Point()和Point(int x...
    遼A丶孫悟空閱讀 1,335評論 0 13
  • 我要單獨提及的感情。 因為記憶力不好,所以一定要寫點什么了。 半年前跟一個小朋友在一起了。2.12正值過年,連面也...
    Jamie_lin閱讀 63評論 0 0