1.方法重载
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。调用重载方法时,Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同的方法。
更具体点
Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法
参数不一样
方法名一样,但参数不一样,这就是重载(overload)。
所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。
为了更直观的了解到重载
进行提问 共有正例和反例
public class TestOverLoad {
void max(int a, int b) {
System.out.println(a > b ? a : b);
}
/*
* int max(int a, int b) {
* return a > b ? a : b;
* }
*/
void max(float a, float b) {
System.out.println(a > b ? a : b);
}
}
这里有void修饰符的两个max方法名字相同,但它们的参数类型不一样,所以可以构成重载。
而int max(int a , int b)方法与void max(int a, int b)方法是不构成重载的,现在它们是重名的两个方法,在一个类中声明两个重名的方法是不允许的,编译会出错。方法名一样,参数类型一样,只有返回值不一样,这个不构成重载,因为方法可以这么调用,调用一个方法时可以不使用的它返回值,所以当调用这两个方法时,把整型的数传进去,由于两个方法都是一样的名字,一样的参数类型,所以编译器无法区分到底要调用的是哪一个方法。
构成重载深层次的原因:只要这两个方法编译器能区分开来,在调用的时候知道要调用的是哪一个,不会产生混淆,这两个方法就构成重载。
对于java无法在静态上下文中引用非静态
解决方法两种
给方法加关键字static
New一个该类的实例再调用这个方法
与普通方法一样 构造方法也可以重载
public class Person {
int id;
int age;
/**
* 构造方法
*/
public Person() {
id=0;
age=20;
}
/**
* 构造方法重载一
* @param i
*/
public Person(int i) {
id=i;
age=20;
}
/**
* 构造方法重载二
* @param i
* @param j
*/
public Person(int i,int j) {
id=i;
age=j;
}
}
2.this的几种用法
当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量。(this是当前对象自己)
this();
访问本类的构造方法
()中可以有参数的 如果有参数 就是调用指定的有参构造
注意事项:
1.this() 不能使用在普通方法中 只能写在构造方法中
2.必须是构造方法中的第一条语句
程序中内存对象的创建使用过程:
程序执行流程说明:
1、先执行main方法(压栈),执行其中的 Person p = new Person();
2、在堆内存中开辟空间,并为其分配内存地址0x1234,紧接着成员变量默认初始化(age = 0);将内存地址0x1234赋值给栈内中的Person p 变量
3、继续执行p.setAge(30)语句,这时会调用setAge(int age)方法,将30赋值为setAge方法中的“age”变量;执行this.age = age语句,将age变量值30 赋值给成员变量this.age为30;
4、setAge()方法执行完毕后(弹栈),回到main()方法,执行输出语句System.out.println(),控制台打印p对象中的age年龄值。
static
一句话来描述: 方便在没有创建对象的情况下来进行调用(方法/变量)。
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。举个简单的例子:
2)static变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
import java.util.*;
以Scanner为例子讲import