1. 程式人生 > >java this,static,package等關鍵字與相關練習

java this,static,package等關鍵字與相關練習

學習心得

一、專業課

1面向物件

1this關鍵字

(1)this呼叫本類中的屬性,也就是類中的成員變數;

 		(2)this呼叫本類中的其他方法;
 		(3)this呼叫本類中的其他構造方法,呼叫時要放在構造方法的首行。			2static

static表示“全域性”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼塊,但是Java語言中沒有全域性變數的概念。

static修飾的成員變數和成員方法獨立於該類的任何物件。也就是說,它不依賴類特定的例項,被類的所有例項共享.只要這個類被載入,Java虛擬機器就能根據類名在執行時資料區的方法區內定找到他們。因此,

static物件可以在它的任何物件建立之前訪問,無需引用任何物件

(1)、靜態方法靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫,因此靜態方法中不能用thissuper關鍵字,不能直接訪問所屬類的例項變數和例項方法 (就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法

(2)static程式碼塊

  static程式碼塊也叫靜態程式碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一

.

3)類記憶體圖分析

publicclassChinese{

Stringname;

intage;

staticString country;

/*

* 構造程式碼塊可以有多個每次生成類時都會執行

* 可以訪問靜態方法變數

*/

{

System.out.println("構造程式碼塊2"+country);

}

voidspeak(){

System.out.println(this.name+ "說:");

}

/*

* static 不能訪問非靜態成員屬性,方法

* 用於初始化靜態變數

* static 構造程式碼快可以有多個

* static 構造程式碼塊,先於main方法執行,而且不管類有幾

個,都執行一次

*/

static{

country= "中國";

System.out.println("靜態程式碼塊2");

}

{

System.out.println("構造程式碼塊1");

}

static{

System.out.println("靜態程式碼塊1");

}

publicstatic void main(String[] args) {

Chinesechinese = new Chinese();

Chinesechinese2 = new Chinese();

/*

* 靜態屬性可以用類名引用,也可以用引用變數引用

*/

System.out.println(Chinese.country);

}

}

執行結果

靜態程式碼塊2

靜態程式碼塊1

構造程式碼塊2中國

構造程式碼塊1

構造程式碼塊2中國

構造程式碼塊1

中國

3package

1、提供多層的名稱空間,解決命名衝突;(處於不同package 中的類可以擁有相同的名字)

2、對類按功能進行分類,使得專案的組織更加清楚

3、結合訪問修飾,有安全機制

4java訪問修飾符

1public:用public修飾的類、類屬變數及方法,包內及包外的任何類(包括子類和普通類)均可以訪問;

2protected:用protected修飾的類、類屬變數及方法,包內的任何類及包外那些繼承了該類的子類才能訪問(此處稍後解釋protected重點突出繼承;

3default:如果一個類、類屬變數及方法沒有用任何修飾符(即沒有 publicprotectedprivate中任何一種修飾),則其訪問許可權為default(預設訪問許可權)。預設訪問許可權的類、類屬變數及方法,包內的任何類(包括繼承了此類的子類)都可以訪問它,而對於包外的任何類都不能訪問它(包括包外繼承了此類的子類)。default重點突出包

4private:用private修飾的類、類屬變數及方法,只有本類可以訪問,而包內包外的任何類均不能訪問它

訪問級別

訪問控制修飾符

同類

同包不同類(不含子類)

同包子類

不同包不同類

(不含子類)

不同包子類

公開

public

受保護

protected

--

√(注意)

預設

沒有訪問控制修飾符

--

--

私有

private

---

---

--

--

5) 面向物件的三大特性

1.封裝

封裝的定義:

  • 首先是抽象,把事物抽象成一個類,其次才是封裝,將事物擁有的屬性和動作隱藏起來,只保留特定的方法與外界聯絡

為什麼需要封裝:

  • 封裝符合面向物件設計原則的第一條:單一性原則,一個類把自己該做的事情封裝起來,而不是暴露給其他類去處理,當內部的邏輯發生變化時,外部呼叫不用因此而修改,他們只調用開放的介面,而不用去關心內部的實現

  • 阻止外部的非法操作

二、小組PK

1題目

1.以下程式能否執行

如果不能請指出錯在那裡,

如果可以請輸出程式結果:

//('A'acsii碼是65)

publicclass Test {

publicstatic void main(String[] args) {

char[]ch = new char[]{65,66,67,68,65,65,68,69,65};

for(inti = 0; i < (ch.length/2);i++){

if(ch[i]!= ch[ch.length-1-i])

System.out.print(ch[i++]);

System.out.print(ch[ch.length-1-i]);

}

}

答案

ABDDA

2.請找出下面程式的錯誤,可能有幾處(請在錯誤語句後面打星*):

publicclass Question {

staticint i,j,k;

Question(inti, int j,int k){

this.i= i;

this.j= j;

this.k= k;

}

voidtest(int i) {

System.out.println(i);

}

staticvoid test(int i){ *//這個test方法與上一個非靜態的test衝突

System.out.println(i);

}

{

i++;

}

static{

j++;

}

publicvoid fun(int k){

Questionq1 = new Question(); *//沒有不帶參的構造引數

k+=(++i)+(j++);

}

publicstatic void main(String[] args) {

Questionq1 = new Question(1,1,1);

System.out.println(q1.i+","+q1.j+","+q1.k);

System.out.println(fun(2)); *//main不能直接呼叫非靜態方法

}

}

3,請找出下面程式的錯誤,可能有幾處(請在錯誤語句後面打星*):

publicclass TestC {

inta=b=2; *//b沒有定義

publicstatic void fun(float f) {

System.out.println(f);

}

publicstatic void main(String[] args) {

inta=1,b=2,c=3,p=4;

System.out.println(Math.sqrt(p*(p-a)(p-b)(p-c))); *//*

fun(2.2); *//2.2預設是double,不能傳給float

System.out.println("2");;

}

}

4.以下程式能否執行

如果不能請指出錯在那裡,

如果可以請輸出程式結果:

publicclass TestD {

inti;

staticint a;

staticint b;

publicTestD(int i) {

this.i= i;

System.out.println(i);

}

static{

a= a^b;

}

{

System.out.println(i);

a= a^b;

}

static{

b= a^b;

}

publicstatic void main(String[] args) {

inti = 2;

TestDtestd = new TestD(i++);

TestD.a= 6;

TestD.b= 8;

System.out.println(TestD.a);

System.out.println(TestD.b);

}

}

答案:

0

2

6

8

5.以下程式能否執行

如果不能請指出錯在那裡,

如果可以請輸出程式結果:

publicclass Test {

intn ;

intarr[][];

publicTest(int n) {

this.n+= n++;

this.arr= new int[n][n];

}

{

n++;

}

public void test(int n){

for(inti = 0;i < n;i++){

for(intj = 0;j <= i;j++){

if(j== 0){

arr[i][j]= 1;

System.out.print(arr[i][j]+"");

}elseif(i == j){

arr[i][j]= 1;

System.out.print(arr[i][j]+"");

}else{

System.out.print(arr[i-1][j-1]+arr[i-1][j]+"");

}

}

System.out.println();

}

}

publicstatic void main(String[] args) {

Testy = new Test (4);

y.test(y.n);

}

}

答案:

1

11

12 1

11 1 1

11 0 1 1

2、對方題目

1.程式是否有錯誤,有則指出錯誤,沒有則寫出程式輸出結果

privateclass Test { //類名不可用private修飾

Stringname;

staticint i;

static{

i++;

}

{

System.out.println("我的名字是:"+name);

}

publicTest(String name){

this.name= name;

}

publicstatic void main(String[] args) {

newTest("寧年");

}

}

2.程式是否有錯誤,有則指出錯誤,沒有則寫出程式輸出結果

publicclass T1 {

publicstatic void main(String[] args) {

PPp1=new PP();

System.out.println(p1.a); //aprivate屬性不能直接訪問

}

}

classPP{

staticprivate int a=10;

static{

a++;

}

publicPP(){

this.a++;

}

}

有錯誤 //aprivate屬性不能直接訪問

3輸出程式執行結果

classPer {

Stringname;

intage;

staticdouble gread;

Per(Stringn,int a){

name= n;

age= a;

}

{

print();

}

static{

gread= 88.5;

inta = 11;

System.out.println(a);

}

voidprint(){

System.out.println("name:"+ name + " age:" + age + " gread:" + gread);

}

}

classDemo1 {

publicstatic void main(String[] args) {

Perp = new Per("mary", 11);

p.print();

}

}

11

name:nullage:0 gread:88.5

name:maryage:11 gread:88.5

4:寫出程式執行結果

publicclass Demo1 {

floata = 0.0F;

staticint b=1;

static{

b++;

}

{

if(a == 0) {

a+= 1;

}

if(a > 0.00f) {

a+= 2;

}

System.out.println(a);

}

publicstatic void main(String[] args) {

System.out.println(newDemo1().a);

System.out.println(Demo1.b);

}

}

5.寫出程式執行結果

publicclass A {

inta=10;

{

System.out.println(a);

a++;

a();

}

publicA(int a){

a();

System.out.println(a);

}

publicvoid a(){

this.a++;

System.out.println(a);

}

publicstatic void main(String[] args) {

Aa=new A(2);

a.a();

}

}

1:編譯出錯,private修飾類

2:私有屬性不能在其他類中訪問

3.11