数据类型传参变化
- 在重载方法中,如果传入的参数的数据类型的字节大小小于方法中声明的形式参数类型的字节大小,那么实际数据类型就会提升,char型略有不同,如果无法找到接受char参数的方法,就会直接升到int。
- 如果传入的参数的数据类型的字节大小大于方法中声明的形式参数类型的字节大小,就得通过类型转换来执行显式窄化转换。如果不这样做,编译器就会报错。
Demotion demotion=new Demotion();
double x=3.14;
demotion.f1(x);
demotion.f2((float)x);
demotion.f3((long)x);
demotion.f4((int)x);
class Demotion{
void f1(char x){
System.out.println("f1(char)");
}
void f1(byte x){
System.out.println("f1(byte)");
}
void f1(short x){
System.out.println("f1(short)");
}
void f1(int x){
System.out.println("f1(int)");
}
void f1(long x){
System.out.println("f1(long)");
}
void f1(float x){
System.out.println("f1(float)");
}
void f1(double x){
System.out.println("f1(double)");
}
void f2(char x){
System.out.println("f2(char)");
}
void f2(byte x){
System.out.println("f2(byte)");
}
void f2(short x){
System.out.println("f2(short)");
}
void f2(int x){
System.out.println("f2(int)");
}
void f2(long x){
System.out.println("f2(long)");
}
void f2(float x){
System.out.println("f2(float)");
}
void f3(char x){
System.out.println("f3(char)");
}
void f3(byte x){
System.out.println("f3(byte)");
}
void f3(short x){
System.out.println("f3(short)");
}
void f3(int x){
System.out.println("f3(int)");
}
void f3(long x){
System.out.println("f3(long)");
}
void f4(char x){
System.out.println("f4(char)");
}
void f4(byte x){
System.out.println("f4(byte)");
}
void f4(short x){
System.out.println("f4(short)");
}
void f4(int x){
System.out.println("f4(int)");
}
}
上面的代码说明了如果基本数据类型的所占字节空间大于要求的参数的所占字节空间,那么就是窄化转化。
this
如果一个类有多个构造器,并且我们想这个类的在一个构造器中调用另一个构造器,那么该怎么办呢?这时候this边发挥了作用。但是this在构造器里面,最多只能调用一个其他构造器,多了便会报错
- 在类中的一个构造器中调用另一个构造器
- 用来表示所在类的引用
class Flower{
int petalCount=0;
String s="initial value";
public Flower(int petals) {
petalCount=petals;
System.out.println("petalCount="+petalCount);
}
public Flower(String ss) {
System.out.println("s="+ss);
s=ss;
}
public Flower(String s,int petals) {
this(petals);
//this(s); this只能调用一个构造器
this.s=s;
System.out.println("String & int args");
}
public Flower() {
this("hi",47);
//this("fsf"); this只能调用一个构造器
System.out.println("default constructor (no args)");
}
}
访问权限修饰符
public class Cookie {
public Cookie(){
System.out.println("Cookie Constructor");
}
void bite() {
System.out.println("bite");
}
}
- Cookie类是public修饰符,任何都能访问。但是Cookie中的void bite()方法没有修饰符,系统默认其为包访问权限。 所以只有同一包下的类才能访问void bite()方法。
- private修饰符,是只能本类的中的成员访问 其他的都不能访问。private修饰构造器,可以防止构造器被调用。
- protected处理的是继承的概念,例如其他包的任何一个类extends了Cookie类,但是由于bite()是包访问权限。 这个类并不能访问bite(),但是如果给bite加protected修饰符,便能访问。protected也提供包访问权限,也就是说,相同包内的其他类也可以访问protected元素。