2008年2月27日
定義一個長方形,求它的周長和面積。用面向?qū)ο蟮姆椒ā?
?
class 長方形 {
????int
長;int
寬;
????int 周長()
????{
????????return 2*(長+寬);
????}
????int 面積()
????{
????????return
長*寬;
????}????????
????public
static
void main(String[] args)
????{
????????長方形 chang1=new 長方形();
????????長方形 chang2=new 長方形();
????????chang1.長=10;
????????chang1.寬=5;
????????System.out.println("周長="+chang1.周長());
????????System.out.println("面積="+chang1.面積());
????????chang2.長=20;
????????chang2.寬=8;
????????System.out.println("周長="+chang2.周長());
????????System.out.println("面積="+chang2.面積());
????}
}
public
class Animal
{
????int
height;
????int
weight;
????void animal()
????{
????????System.out.println("Animal constract");
????}
????void eat()
????{
????????System.out.println("Animal eat");
????}
????void sleep()
????{
????????System.out.println("Animal sleep");
????}
????void breathe()
????{
????????System.out.println("Animal breathe");
????}
}
/*
* 理解繼承是理解面向?qū)ο蟪绦蛟O(shè)計的關(guān)鍵
* 在java中,通過關(guān)鍵字extends繼承一個已有的類,被繼承的類稱為父類(超類,基類),新的類稱為子類(派生類)。
* * 在java中,不允許多繼承
*/
class Fish extends Animal
{
????void fish()
????{
????????
????????System.out.println("fish constract");
????}
????void breathe()
????{
????????//super.breathe();
????????//super.height=40;
????????System.out.println("fish boo");
????}
}
class Integration
{
????public
static
void main(String[]args)
????{
????????//Animal an=new Animal();
????????Fish fh=new Fish();
????????//an.breathe();
????????//fh.height=30;
????????fh.breathe();
????????
????}
}
/*
*在子類當(dāng)中定義一個與父類同名,返回類型,參數(shù)類型均一致的方法,稱為方法的覆蓋
*方法的覆蓋發(fā)生在子類和父類之間。
*調(diào)用父類的方法使用super
*/
/*特殊變量super,提供了父類的訪問
* 可以使用super訪問被父類被子類隱藏的變量或覆蓋的方法
* 每個子類構(gòu)造方法的第一句,都是隱藏的調(diào)用super(),如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯器中就會報錯。
*
*
*
*/
靜態(tài)方法和靜態(tài)變量是屬于某一個類,而不屬于類的對象。
靜態(tài)方法和靜態(tài)變量的引用直接通過類名引用。
在靜態(tài)方法中不能調(diào)用非靜態(tài)的方法和引用非靜態(tài)的成員變量。反之,則可以。
可以用類的對象obj去調(diào)用靜態(tài)的方法method(),如:obj.method()。
?
Final在聲明時需要進(jìn)行初始化。
使用關(guān)鍵字final定義常量,例如:final double PI=3.1415926
作為一種約定,在定義常量時,通常采用大寫的形式。
Final常量可以在聲明的同時賦初值,也可以在構(gòu)造函數(shù)中賦初值。
為了節(jié)省內(nèi)存,我們通常將常量聲明為靜態(tài)的(static)
?
在聲明為static時,就要在聲明final常量時進(jìn)行初始化。
static
final
double
//PI=3.1415926;
????int
x,y;
????point(int a,int b)
????{
????????PI=3.1415926;
????????x=a;
????????y=b;
????}
這種方式是錯誤的。
正確的方法如下:
static
final
double
PI=3.1415926;
?
This變量表示成員對象本身。
public
class point
{
????int
x,y;
????point(int a,int b)
????{
????????x=a;
????????y=b;
????}
????point()
????{????????
????}
????void output()
????{
????System.out.println(x);
????System.out.println(y);
????}
????void output(int x,int y)
????{
????????this.x=x;
????????this.y=y;
????}
????public
static
void main(String[] args)
????{
????????point pt;
????????/*pt=new point();
????????{
????????????
????????????pt.output();????????????
????????}*/
????????pt=new point(3,3);
????????{
????????????pt.output(5,5);
????????????pt.output();
????????}
????}
}
當(dāng)類中有2個同名變量,一個屬于類(類的成員變量),而另一個屬于某個特定的方法(方法中的局部變量),使用this區(qū)分成員變量和局部變量。
使用this簡化構(gòu)造函數(shù)的調(diào)用。
public
class point
{
????int
x,y;
????point(int a,int b)
????{
????????x=a;
????????y=b;
????}
????point()
????{????
????????this(1,1);
????}
????void output()
????{
????System.out.println(x);
????System.out.println(y);
????}
????void output(int x,int y)
????{
????????this.x=x;
????????this.y=y;
????}
????public
static
void main(String[] args)
????{
????????point pt;
????????pt=new point();
????????pt.output();
????}
}
我們使用一個不帶參數(shù)的構(gòu)造方法來調(diào)用帶參數(shù)的構(gòu)造方法,在不帶參數(shù)的構(gòu)造方法中使用this(1,1);this本身表示pt對象,他調(diào)用帶參數(shù)的成員方法,來給x和y賦值。大大簡化了調(diào)用方法。
在一個類中所有的實例(對象)調(diào)用的成員方法在內(nèi)存中只有一份拷貝,盡管在內(nèi)存中可能有多個對象,而數(shù)據(jù)成員(實例變量,成員變量)在類的每個對象所在的內(nèi)存中都存在著一份拷貝。This變量允許相同的實例方法為不同的對象工作。每當(dāng)調(diào)用一個實例方法時,this變量將被設(shè)置成引用該實例方法的特定的類對象。方法的代碼接著會與this所代表的對象的特定數(shù)據(jù)建立關(guān)聯(lián)。
面向?qū)ο蟮姆椒ㄒ冉ㄒ粋€類,這個類相當(dāng)于一個模板,然后要為這個類實例化一個對象。然后對這個對象才能進(jìn)行操作。
類具有狀態(tài)和行為的方式。
狀態(tài)就像人這個類的狀態(tài)有身高和體重,行為有吃飯這個行為。
下面用一個點(diǎn)來說明
public
class
point
{
????int
x,y;
????void output()
????{
????System.out.println(x);
????System.out.println(y);
????}
????public
static
void main(String[] args)
????{
????????point pt;
????????pt=new
point();
????????{
????????????pt.x=10;
????????????pt.y=10;
????????????pt.output();????????????
????????}
????}
}
構(gòu)造函數(shù),構(gòu)造函數(shù)和類的方法類似。構(gòu)造方法的名字和類名相同,并且沒有返回值,構(gòu)造方法主要為類的對象定義初始化狀態(tài)。
我們不能直接調(diào)用構(gòu)造函數(shù),只能通過new關(guān)鍵字來調(diào)用從而創(chuàng)建類的實例
Java的類都要求有構(gòu)造方法,如果沒有定義構(gòu)造方法,則java會默認(rèn)使用一個缺省的方法,就是不帶參數(shù)的方法。
public
class point
{
????int
x,y;
????point()
????{
????????x=5;
????????y=10;
????}
????void output()
????{
????System.out.println(x);
????System.out.println(y);
????}
????public
static
void main(String[] args)
????{
????????point pt;
????????pt=new point();
????????{
????????????pt.output();????????????
????????}
????}
}
對于構(gòu)造方法,還可以使用參數(shù)的方法,在實例化對象的時候,直接傳遞參數(shù)就可以了
public
class point
{
????int
x,y;
????point(int a,int b)
????{
????????x=a;
????????y=b;
????}
????void
output()
????{
????System.out.println(x);
????System.out.println(y);
????}
????public
static
void main(String[] args)
????{
????????point pt;
????????pt=new point(3,3);
????????{
????????????pt.output();????????????
????????}
????}
}
New關(guān)鍵字的作用
為對象分配內(nèi)存空間。
引起對象構(gòu)造方法的調(diào)用。
為對象返回一個引用。
?
各種數(shù)據(jù)類型的默認(rèn)值是:
數(shù)值型: 0
Boolean: false
Char: "\0"
對象: null
?
public
class point
{
????int
x,y;
????point(int a,int b)
????{
????????x=a;
????????y=b;
????}
????void
output()
????{
????System.out.println(x);
????System.out.println(y);
????}
????public
static
void main(String[] args)
????{
????????point pt;
????????pt=new point(3,3);
????????{
????????????pt.output();????????????
????????}
????}
}
輸出是0 0
帶參數(shù)的構(gòu)造方法和不帶參數(shù)的構(gòu)造方法可以同時使用。只要參數(shù)類型或參數(shù)個數(shù)不同。在調(diào)用是是通過對指定參數(shù)類型和參數(shù)個數(shù)的方法來調(diào)用哪個構(gòu)造方法。
?
?
這就是方法的重載(overload):重載構(gòu)成的條件:方法的名稱相同,但參數(shù)類型或參數(shù)個數(shù)不同,才能構(gòu)成方法的重載。
public
class point
{
????int
x,y;
????point(int a,int b)
????{
????????x=a;
????????y=b;
????}
????point()
????{
????????
????}
????
????void output()
????{
????System.out.println(x);
????System.out.println(y);
????}
????public
static
void main(String[] args)
????{
????????point pt;
????????pt=new point();
????????{
????????????pt.output();????????????
????????}
????????/*pt=new point(3,3);
????????{
????????????pt.output();
????????}*/
????}
}
這2種方法都是可以使用的。
Java中有3個移位運(yùn)算符
左移: <<
帶符號右移:>>
無符號右移:>>>
數(shù) x x<<2 x>>2 x>>>2
17 00010001 01000100 00000100 00000100
-17 11101111 10111100 11111011 00111011
看一下程序0x表示16進(jìn)制。ffffffff表示-1
public
class test {
????public
static
void main(String[] args) {
????????int i=0xffffffff;
????????int c=i<<2;
????????System.out.println(i);
????????System.out.println(c);
????????}
}
輸出是-1和-4.這表示
public
class test {
????public
static
void main(String[] args) {
????????int i=0xffffffff;
????????int c=i<<2;
????????System.out.println(Integer.toHexString(i));
????????System.out.println(Integer.toHexString(c));
????????}
}
使用Integer.toHexString()將10進(jìn)制轉(zhuǎn)換位16進(jìn)制。
輸出位ffffffff 和fffffffc左移2位最后補(bǔ)2個0,最后的1100轉(zhuǎn)換位16進(jìn)制就是c
?
public
class test {
????public
static
void main(String[] args) {
????????int i=0xffffffff;
????????int c=i>>>2;
????????System.out.println(Integer.toHexString(i));
????????System.out.println(Integer.toHexString(c));
????????}
}
無符號右移輸出是ffffffff和3fffffff 右移2位后最左段是0011,轉(zhuǎn)換位16進(jìn)制就是3
?
練習(xí):
將一個整數(shù)110從右端開始的4到7位變?yōu)?.
答:要想將4到7位變?yōu)?,先構(gòu)造一個4到7位是0的數(shù),然后用110和這個數(shù)與&。任何數(shù)和0與都是0,就完成了任務(wù)。要構(gòu)造一個4到7位是0的數(shù),先構(gòu)造一個低4位是1的數(shù)15,然后將它左移3位,然后取反,就構(gòu)造成4到7位是0的數(shù)了。程序如下。
public
class test {
????public
static
void main(String[] args) {
????????int i=15;
????????int j=i<<3;
????????int c=~j;
????????int k=110;
????????int
l=k&c;
????????System.out.println(Integer.toBinaryString(i));
????????System.out.println(Integer.toBinaryString(j));
????????System.out.println(Integer.toBinaryString(c));
????????System.out.println(Integer.toBinaryString(k));
????????System.out.println(Integer.toBinaryString(l));
????????}
}
輸出是
00001111
01111000
10000111
01101110
00000110
?
將一個數(shù)左移一位等于是將數(shù)*2,右移一位相當(dāng)于將數(shù)/2。
左移2位相當(dāng)與乘兩次2,右移2位相當(dāng)與除兩次2.
& 按位與 都真才真
01101101
&
00110111
00100101
| 按位或 只要1個真就真,都假才假
01101101
|
00110111
01111111
^按位異或 一真一假才為真,都真都假就是假。
01101101
^
00110111
01011010
~按位取反 0變1,1變0
~01101101
10010010
在java中一個字節(jié)由8個二進(jìn)位組成。
計算機(jī)中有原碼,反碼,和補(bǔ)碼。
原碼
將最高為作為符號位0正,1負(fù)。其余各位表示數(shù)值的絕對值。
+7的原碼是 00000111
-7的原碼是 10000111
原碼的問題是+0和-0的表示
+0是00000000
-0是 10000000
2個數(shù)值不同。
反碼
一個數(shù)如果為正,則它的反碼與原碼相同,如果為負(fù),則符號位為1,其余取反。
+7是00000111
-7 是 11111000
反碼的問題也是+0和-0的問題
+0是 00000000
-0 是 11111111
2個數(shù)值不同。
補(bǔ)碼
利用溢出,我們將減法變成加法。 一個數(shù)如十進(jìn)制,一個字節(jié)一個數(shù),有8位,超過就進(jìn)一。
一個數(shù)為正,則它的原碼,反碼,補(bǔ)碼相同。如果為負(fù),則符號位為1,其余對原碼取反。然后加1
+7是 00000111
-7是 11111001
+0是00000000
-0是100000000,然后丟掉最高的9位則為00000000
和+0的表示相同,所以計算機(jī)中是采用的是補(bǔ)碼。
已知一個負(fù)數(shù)的補(bǔ)碼,轉(zhuǎn)換為十進(jìn)制。
- 先對各位取反。
- 將其轉(zhuǎn)換為十進(jìn)制數(shù)
- 加上負(fù)號,再減去1.
如 11111010 先取反
00000101 轉(zhuǎn)換為十進(jìn)制
是5 加上負(fù)號
是-5 再減去1
是-6
public
class Welcome {
????public
static
void main(String[] args) {
????????for(int i=0;i<10;i++)
????????{System.out.println(i);
????????}
????}
}
對于java中for語句中定義的變量的作用域只在{}內(nèi)。For以外不能訪問。這點(diǎn)和c語言不同,知道就可以了。
I++ 是先取出i的值,然后參與運(yùn)算+1。
public
class Welcome {
????public
static
void main(String[] args) {
????????int
i=3;
????????System.out.println(i++);
????????}
}
輸出為3
++i是先+1,然后參與運(yùn)算。
public
class Welcome {
????public
static
void main(String[] args) {
????????int
i=3;
????????System.out.println(++i);
????????}
}
輸出為4
下面這個例子說明了這個道理
public
class Welcome {
????public
static
void main(String[] args) {
????????int i=3;
????????int count=(i++)+(i++)+(i++);
????????System.out.println(i);
????????System.out.println(count);
????????}
}
輸出為6和12,i取了3次是6,count是3+4+5=12
public
class Welcome {
????public
static
void main(String[] args) {
????????int
i=3;
????????int count=(++i)+(++i)+(++i);
????????System.out.println(i);
????????System.out.println(count);
????????}
}
輸出為6和15,i取了3次是6,count是4+5+6=15
Java中,二維數(shù)組的定義和一維數(shù)組是一樣的。
public class Welcome {
public static void main(String[] args) {
int [][] num;
num=new int[3][4];
num[0][1]=1;
num[1][3]=12;
num[2][2]=21;
}
}
Java中二維數(shù)組的列數(shù)可以不同,比如第一行是2列,第二行是4列,等等。
有些類似與c語言中的指針數(shù)組。
public class Welcome {
public static void main(String[] args) {
int [][] num;
num=new int[3][];
num[0]=new int[2];
num[1]=new int[4];
num[2]=new int[3];
num[0][1]=12;
num[1][3]=23;
num[2][2]=34;
System.out.println(num[0][1]);
System.out.println(num[1][3]);
System.out.println(num[2][2]);
}
}
在java中沒有定義的自動賦值為0.
在定義時可以為二維數(shù)組來定義,但是在賦初值時 ,不要在定義大小了
int [][] num=new int[3][]{1,2,3,4,5,2,3,4,5,6} //error
public class Welcome {
public static void main(String[] args) {
int [][] num=new int[][]{1,2,3,4,5,2,3,4,5,6}; //error
int [][] num=new int[][]{{1,2,3,4,5},{2,3,4,5,6}}; //ok
}
}
定義二維數(shù)組還有一種方式
public class Welcome {
public static void main(String[] args) {
int [][] num={1,2,3,4,5,2,3,4,5,6}; //error
}
}
也可以定義不規(guī)則的二維數(shù)組
public class Welcome {
public static void main(String[] args) {
int [][] num={{1,2,3},{4,5},{2}};
System.out.println(num[0][2]);
System.out.println(num[1][1]);
System.out.println(num[2][0]);
}
}
在java中,不能使用像int num[3];這樣的定義數(shù)組,在定義數(shù)組時不能分配空間的大小,只能通過為數(shù)組添加對象來分配空間。
public class Welcome {
public static void main(String[] args) {
int num[];
num=new int[3];
}
}
或者在定義時直接定義大小。
public class Welcome {
public static void main(String[] args) {
int num[]=new int[3];
}
}
Java中建議使用int[] num 這種方式這種方式定義了一個int類型的數(shù)組[],數(shù)組名稱為num。
在定義時還可以直接初始化
public class Welcome {
public static void main(String[] args) {
int[] num={1,2,3};
}
}
但是這種方法只能在定義時進(jìn)行。
public class Welcome {
public static void main(String[] args) {
int[] num=new int[]{1,2,3};
}
}
還可以使用new int方法來定義,如上
int[] num =new int[3]{1,2,3};這樣的寫法也是不允許的。不能分配空間大小。
最簡單的方法是
public class Welcome {
public static void main(String[] args) {
int [] num;
num=new int[3];
num[0]=1;
num[1]=12;
num[2]=21;
System.out.println(num[0]);
System.out.println(num[1]);
System.out.println(num[2]);
}
}
對字符類型賦值使用單引號' ',
public class Welcome {
public static void main(String[] args) {
char ch;
ch='a';
System.out.println(ch);
}
}
輸出為a
字符類型還可以直接使用整數(shù)來賦值,因為java中對字符類型使用的是uncode字符。
public class Welcome {
public static void main(String[] args) {
char ch;
ch=98;
System.out.println(ch);
}
}
輸出為b
在java中小數(shù)常量被默認(rèn)為double類型,如1.3默認(rèn)為double類型。如果要聲明為float類型,需要在之后加f,如1.3f
public class Welcome {
public static void main(String[] args) {
float f;
f=1.3f;
System.out.println(f);
}
}
輸出為1.3
在java中boolean 布爾類型只有2個取值是true和false,不能賦值為1之類的整數(shù)。
public class Welcome {
public static void main(String[] args) {
boolean bool;
bool=true;
System.out.println(bool);
}
}
輸出為true
在做條件判斷的時候,不能再像c語言那樣使用if(1)或where(1)這樣的語句。
只能寫為if(true)或where(true)這樣。
Byte b;
b=3;
b=b*3;
System.out.pringln(b);
編譯時會提示發(fā)現(xiàn)int類型,需要byte類型,這是因為b=b*3java會自動將參與運(yùn)算的數(shù)據(jù)自動轉(zhuǎn)換為int類型。如果要輸出正確的數(shù)據(jù)則要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
b=(byte)(b*3);
這樣才會對