2008年2月20日
定義一個長方形,求它的周長和面積。用面向對象的方法。
?
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");
????}
}
/*
* 理解繼承是理解面向對象程序設計的關鍵
* 在java中,通過關鍵字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();
????????
????}
}
/*
*在子類當中定義一個與父類同名,返回類型,參數類型均一致的方法,稱為方法的覆蓋
*方法的覆蓋發生在子類和父類之間。
*調用父類的方法使用super
*/
/*特殊變量super,提供了父類的訪問
* 可以使用super訪問被父類被子類隱藏的變量或覆蓋的方法
* 每個子類構造方法的第一句,都是隱藏的調用super(),如果父類沒有這種形式的構造函數,那么在編譯器中就會報錯。
*
*
*
*/
靜態方法和靜態變量是屬于某一個類,而不屬于類的對象。
靜態方法和靜態變量的引用直接通過類名引用。
在靜態方法中不能調用非靜態的方法和引用非靜態的成員變量。反之,則可以。
可以用類的對象obj去調用靜態的方法method(),如:obj.method()。
?
Final在聲明時需要進行初始化。
使用關鍵字final定義常量,例如:final double PI=3.1415926
作為一種約定,在定義常量時,通常采用大寫的形式。
Final常量可以在聲明的同時賦初值,也可以在構造函數中賦初值。
為了節省內存,我們通常將常量聲明為靜態的(static)
?
在聲明為static時,就要在聲明final常量時進行初始化。
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();
????????}
????}
}
當類中有2個同名變量,一個屬于類(類的成員變量),而另一個屬于某個特定的方法(方法中的局部變量),使用this區分成員變量和局部變量。
使用this簡化構造函數的調用。
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();
????}
}
我們使用一個不帶參數的構造方法來調用帶參數的構造方法,在不帶參數的構造方法中使用this(1,1);this本身表示pt對象,他調用帶參數的成員方法,來給x和y賦值。大大簡化了調用方法。
在一個類中所有的實例(對象)調用的成員方法在內存中只有一份拷貝,盡管在內存中可能有多個對象,而數據成員(實例變量,成員變量)在類的每個對象所在的內存中都存在著一份拷貝。This變量允許相同的實例方法為不同的對象工作。每當調用一個實例方法時,this變量將被設置成引用該實例方法的特定的類對象。方法的代碼接著會與this所代表的對象的特定數據建立關聯。
面向對象的方法要先建一個類,這個類相當于一個模板,然后要為這個類實例化一個對象。然后對這個對象才能進行操作。
類具有狀態和行為的方式。
狀態就像人這個類的狀態有身高和體重,行為有吃飯這個行為。
下面用一個點來說明
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();????????????
????????}
????}
}
構造函數,構造函數和類的方法類似。構造方法的名字和類名相同,并且沒有返回值,構造方法主要為類的對象定義初始化狀態。
我們不能直接調用構造函數,只能通過new關鍵字來調用從而創建類的實例
Java的類都要求有構造方法,如果沒有定義構造方法,則java會默認使用一個缺省的方法,就是不帶參數的方法。
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();????????????
????????}
????}
}
對于構造方法,還可以使用參數的方法,在實例化對象的時候,直接傳遞參數就可以了
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關鍵字的作用
為對象分配內存空間。
引起對象構造方法的調用。
為對象返回一個引用。
?
各種數據類型的默認值是:
數值型: 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
帶參數的構造方法和不帶參數的構造方法可以同時使用。只要參數類型或參數個數不同。在調用是是通過對指定參數類型和參數個數的方法來調用哪個構造方法。
?
?
這就是方法的重載(overload):重載構成的條件:方法的名稱相同,但參數類型或參數個數不同,才能構成方法的重載。
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個移位運算符
左移: <<
帶符號右移:>>
無符號右移:>>>
數 x x<<2 x>>2 x>>>2
17 00010001 01000100 00000100 00000100
-17 11101111 10111100 11111011 00111011
看一下程序0x表示16進制。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進制轉換位16進制。
輸出位ffffffff 和fffffffc左移2位最后補2個0,最后的1100轉換位16進制就是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,轉換位16進制就是3
?
練習:
將一個整數110從右端開始的4到7位變為0.
答:要想將4到7位變為0,先構造一個4到7位是0的數,然后用110和這個數與&。任何數和0與都是0,就完成了任務。要構造一個4到7位是0的數,先構造一個低4位是1的數15,然后將它左移3位,然后取反,就構造成4到7位是0的數了。程序如下。
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
?
將一個數左移一位等于是將數*2,右移一位相當于將數/2。
左移2位相當與乘兩次2,右移2位相當與除兩次2.
& 按位與 都真才真
01101101
&
00110111
00100101
| 按位或 只要1個真就真,都假才假
01101101
|
00110111
01111111
^按位異或 一真一假才為真,都真都假就是假。
01101101
^
00110111
01011010
~按位取反 0變1,1變0
~01101101
10010010
在java中一個字節由8個二進位組成。
計算機中有原碼,反碼,和補碼。
原碼
將最高為作為符號位0正,1負。其余各位表示數值的絕對值。
+7的原碼是 00000111
-7的原碼是 10000111
原碼的問題是+0和-0的表示
+0是00000000
-0是 10000000
2個數值不同。
反碼
一個數如果為正,則它的反碼與原碼相同,如果為負,則符號位為1,其余取反。
+7是00000111
-7 是 11111000
反碼的問題也是+0和-0的問題
+0是 00000000
-0 是 11111111
2個數值不同。
補碼
利用溢出,我們將減法變成加法。 一個數如十進制,一個字節一個數,有8位,超過就進一。
一個數為正,則它的原碼,反碼,補碼相同。如果為負,則符號位為1,其余對原碼取反。然后加1
+7是 00000111
-7是 11111001
+0是00000000
-0是100000000,然后丟掉最高的9位則為00000000
和+0的表示相同,所以計算機中是采用的是補碼。
已知一個負數的補碼,轉換為十進制。
- 先對各位取反。
- 將其轉換為十進制數
- 加上負號,再減去1.
如 11111010 先取反
00000101 轉換為十進制
是5 加上負號
是-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語句中定義的變量的作用域只在{}內。For以外不能訪問。這點和c語言不同,知道就可以了。
I++ 是先取出i的值,然后參與運算+1。
public
class Welcome {
????public
static
void main(String[] args) {
????????int
i=3;
????????System.out.println(i++);
????????}
}
輸出為3
++i是先+1,然后參與運算。
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中,二維數組的定義和一維數組是一樣的。
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中二維數組的列數可以不同,比如第一行是2列,第二行是4列,等等。
有些類似與c語言中的指針數組。
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.
在定義時可以為二維數組來定義,但是在賦初值時 ,不要在定義大小了
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
}
}
定義二維數組還有一種方式
public class Welcome {
public static void main(String[] args) {
int [][] num={1,2,3,4,5,2,3,4,5,6}; //error
}
}
也可以定義不規則的二維數組
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];這樣的定義數組,在定義數組時不能分配空間的大小,只能通過為數組添加對象來分配空間。
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類型的數組[],數組名稱為num。
在定義時還可以直接初始化
public class Welcome {
public static void main(String[] args) {
int[] num={1,2,3};
}
}
但是這種方法只能在定義時進行。
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
字符類型還可以直接使用整數來賦值,因為java中對字符類型使用的是uncode字符。
public class Welcome {
public static void main(String[] args) {
char ch;
ch=98;
System.out.println(ch);
}
}
輸出為b
在java中小數常量被默認為double類型,如1.3默認為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之類的整數。
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);
編譯時會提示發現int類型,需要byte類型,這是因為b=b*3java會自動將參與運算的數據自動轉換為int類型。如果要輸出正確的數據則要進行強制類型轉換。
b=(byte)(b*3);
這樣才會對
public class Welcome
//聲明public的類,應該作為文件名,一個源文件只能有1個或沒有public的類
{
public static void main(String[] args)
{
System.out.print("你好\n");
//不加ln,不加換行。或者在之后加\n也是換行
System.out.println("歡迎使用java開發");
//輸出命令,牢記!
}
}