1、初始化一般是通过构造器进行初始化的,如果类中没有写构造器则编译器自动为其提供默认构造器。如果程序中已经写了构造器,则编译器不会提供默认构造器。
Banana b=new Banana();
2、构造器的重载
如果想要以多种方式创建一个对象该怎么办?
方法名相同,参数个数(或类型)不同的构造器同时存在,就是构造器重载。构造器重载是必须的,但是也可以应用到其他方法中。
//构造器重载
<span style="color:#000000;">public Constructor02(){}
public Constructor02(int i){}
public Constructor02(int i,int j){}
public Constructor02(float i){}</span>
3、构造方法区分
每个重载方法都有一个唯一的参数类型列表,用来区分具体调用哪个方法。
但是基本类型能够从一个较小的类型自动提升至一个较大的类型。如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升到int.
提升顺序为:byte<short<int<long<float<double:如果是说实际类型是byte类型,它首先向上提升为short,如果没有short类型,则提升为int,如果没有int则提升为long......
char直接提升为int及以上的类型。
<span style="color:#000000;">package jin.feng1;
class Constructor02{
public Constructor02(){}
public Constructor02(int i){}
public Constructor02(int i,int j){}
public Constructor02(float i){}
//void print(int i){ System.out.println("int");}
void print(float i){ System.out.println("float");}
//void print(char i){ System.out.println("char");}
void print(short i){ System.out.println("short");}
void print(double i){ System.out.println("double");}
}
public class Constructor01
{
public static void main(String[] args)
{
Constructor02 constructor02=new Constructor02();
char c='a';
int a=1;
float b=9;
double d=9;
constructor02.print(c);
}
}
//output
float
</span>
4、为什么返回值区分不了重载方法
例如方法定义如下:
void f(){}
int f(){return 1;}
调用的时候f(),则编译器不知道该调用哪个方法。所以用返回值区分是行不通的。
5、this关键字
this表示当前对象的引用
如果你希望在方法内部获得对当前对象的引用,this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。
package jin.feng1;
class Banana{
void print(){}
void peel(int i){
print();//直接调用,编译器自动转变为this.print()
}
}
public class This01
{
public static void main(String[] args)
{
Banana a=new Banana();
Banana b=new Banana();
a.peel(1);//编译自动添加this 转变为Banana.peel(a,1)
b.peel(2);
}
}
一般编译器都会帮你自动添加,所以只有当需要明确指出对当前对象的引用时,才需要使用this关键字。
Banana increment(){
i++;
return this; //
}
将当前对象传递给其他方法:
return Peel.peel(this);
如果想要在构造器中调用构造器,避免重复
<span style="color:#000000;BACKGROUND-COLOR: #ffffff">public Constructor02(){}
public Constructor02(int i){this();} //产生符合此参数列表的某个构造器的明确调用
public Constructor02(int i,int j){this(i);}
public Constructor02(float i){}</span>
6、static关键字
一个类中static方法只能访问static类型,还可以通过创建对象进行访问其他非static方法(一般是main方法中,其他方法中没什么实际意义)。
但是非static方法既能够访问static变量又能够访问static方法。
<span style="color:#000000;">class Banana{
int j;
static int i;
static void count(){
Banana b9=new Banana();
b9.i=9;
b9.j=8; //通过创建对象访问其非static类型的
b9.print(); //通过创建对象访问其非static类型的
//j++; 不可直接访问
//print();
i++;//直接访问static变量
}
void print(){ //非static方法直接访问static成员。
System.out.println("i:"+i);
count();
}
Banana increment(){
i++;
return this;
}
}
</span>
注意:static成员每个类仅仅只有一份
static类型的成员变量一般用来计数,因为每个类仅仅只有一份,可以对创建对象进行计数啊
但是static类型的成员方法有什么用?
静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的 那在什么时候需要呢?
一般是为了方便调用才会声明为static方法:例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。
注意使用:
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解, 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。