方法的重載
方法名相同,參數不同(參數的個數,參數的類型)
方法在調用過程中編譯器能明確調用哪個方法,可以區分開來
public class TestoverFunc {
void max(int a,int b){
System.out.println("int");
System.out.println( a > b ? a : b);
}
void max(short a,short b){
System.out.println("short");
System.out.println( a > b ? a : b);
}
//重名,max(1,2);調用方法時無法區分
//int max(int a,int b){
//return a > b ? a : b;
//}
void max(double a,double b){
System.out.println( a > b ? a : b);
}
public static void main(String [] args){
TestoverFunc t = new TestoverFunc();
t.max(1,2);
t.max(1.2,2.0);
short a = 1;
short b = 2;
t.max(a,b);//調用short類型的函數
}
}
class Person{
int id;
int age;
//構造方法重載
Person(){
id = 0;
age = 20;
}
Person(int _id){
id = _id;
age = 2;
}
Person(int _id,int _age){
id = _id;
age = _age;
}
void info(){
System.out.println("id="+id+"age="+age);
}
//方法重載
void info(String s){
System.out.println("s:"+"id="+id+"age="+age);
}
public void setAge(int _age){
age = _age;
}
}
public class TestOverload {
public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person(0);
Person p3 = new Person(1,22);
Person p4 = new Person(2,23);
//調用方法是針對於對象的,必須new一個對象,對這個對象調用方法
p3.setAge(25);//id=1age=25
p3.info();
int age = 25;
p4.setAge(age++);//s:id=2age=25
p4.info("p4");
System.out.println(age);//age = 26
}
}
對象的創建與使用(調用方法是針對於對象的)
1.必須用new關鍵字創建對象;
2.使用對象引用.成員變量 對象引用.方法
3.同一類的每個對象有不同的成員變量存儲空間
4.同一類的每個對象共享該類的方法
經典例子
class Point {
//參數
int x;
int y;
//構造方法
Point(int _x, int _y){
x = _x;
y = _y;
}
//方法函數
public void setX(int _x){
x = _x;
}
public void setY(int _y){
y = _y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}
class Circle {
Point o;//圓心
int radius;//半徑
//重載構造方法
Circle(Point _o,int r){
o = _o;
radius = r;
}
Circle(int r){
o = new Point(0,0);
radius = r;
}
public void setO(int _x,int _y){//c1.setO() --> o.setX(),完成對c1中的x的修改
o.setX(_x);
o.setY(_y);
}
public Point getO(){
return o;
}
public void setR(int r){
radius = r;
}
public int getR(){
return radius;
}
public double area(int r){
return 3.14 * r * r;
}
boolean contains(Point p){//判斷點是否在圓內
double x = p.getX() - o.getX();//o爲當前調用的圓的圓心
double y = p.getY() - o.getY();
if(x*x + y*y > radius * radius){
return false;
}
else{
return true;
}
}
}
public class TestCircle {
//測試部分:new對象,調用類中定義的方法
public static void main(String[] args){
Circle c1 = new Circle(new Point(1,2),2);
System.out.println("c1:"+c1.getO().getX()+","+c1.getO().getY());
c1.setO(5,6);//
System.out.println("c1:"+c1.getO().getX()+","+c1.getO().getY());
Circle c2 = new Circle(5);
c2.setR(9);
System.out.println("c2:"+c2.getO().getX()+","+c2.getO().getY());
Circle c3 = new Circle(3);
System.out.println(c3.contains(new Point(1,1)));
}
}
this使用
//this 是指向自身的引用
class Leaf {
int i ;
Leaf(int i){
this.i = i;//把局部變量i的值賦給當前對象的成員變量i
}
Leaf increament(){
i++;
return this;
}
void print(){
System.out.println(i);
}
/*void print(int i){
System.out.println(i);
}*/
}
public class TestThis {
public static void main(String[] args){//總是忘寫main函數!!!
int i = 100;
Leaf f = new Leaf(i);
f.print();
f.increament().increament().print();//102
f.increament().print();//103 //this一直對當前對象進行處理,累加i
}
}
static 成員變量只有一份,且被類的所有對象共享
static 方法不可訪問非static成員,非靜態成員只能new一個對象進行訪問;
class Cat {
static int sid = 0;//在data seg 中僅一份
//此處去掉 static int sid = 0;//在這個位置sid屬於成員變量(存放在堆內存中)
String name;
int id;
Cat(String name){
this.name = name;
id = sid++;
}
}
public class TestStatic {
public static void main(String[] args){
Cat.sid = 100;//可用類名直接訪問靜態變量
Cat mimi = new Cat("mimi");
Cat pipi = new Cat("pipi");
System.out.println(mimi.id);
System.out.println(pipi.id);
System.out.println(Cat.sid);//sid:102 計數
}
}