1、定义:
一个类中,可以有多个同名方法,但是要求形参列表不一致。
class B {
public int calculate(int n1, int n2) {
return n1 + n2;
}
public double calculate(int n1, double n2) {
return n1 - n2;
}
}
2、注意事项:
1、方法名:必须相同。
2、形参列表:必须不同(形参类型、个数、顺序)至少一样不同。
3、返回类型:无要求。
下面没有构成方法重载:形参列表一致
public int cal(int n1, int n2) {
return n1 + n2
]
public void cal(int a1, int a2) {
System.out.println(a1 + a2);
}
1、可变参数:
java运行将同一个类中多个同名同功能单参数个数不同的方法,封装成一个方法。
需求:求n1 + n2,n1 + n2 + n3,n1 + n2 + n3 + n4的值。
public int sum(int n1, int n2) {
return n1 + n2;
}
public int sum(int n1, int n2, int n3) {
return n1 + n2 + n3;
}
可以将sum当做数组看待:
public int sum(int... sum) {
int res = 0;
for (int i = 0; i < sum.length; i++) {
res += sum[i];
}
return res;
}
2、可变参数注意事项:
1、实参可以是多个或者0个。
2、实参可以直接传入一个数组。
3、可变参数可以和形参一起存在,但是可变参数必须在最后。
4、一个方法最多一个可变参数。
public void fn(String str, int... sum) {
}
1、作用域;
1、全局变量(属性):作用域为整个类。
2、局部变量:作用域为定义它的代码块中,如方法中。
3、全局变量可以不赋值直接使用,有默认值;局部变量必须先赋值才能使用,因为无默认值。
class Person {
int num;
public void method() {
int n1 = 10;
System.out.println(num);
}
}
2、注意事项:
1、属性和局部变量可以重名,访问时遵循就近原则。
2、在同一个作用域中,两个局部变量不能重名。
3、属性生命周期:伴随着对象的创建而创建,随着对象的死亡而死亡。
局部变量:随着它的代码块的执行而创建,随着代码块的介绍而死亡,即在方法调用中。
4、全局变量:可以被本类或者其它类调用(使用对象调用)
局部变量:只能在本类对应方法中使用。
5、全局变量:可以加修饰符。
局部变量:不可以加修饰符。
public class text {
public static void main(String[] args) {
B b = new B();
A a = new A();
a.test1();
a.test2(b);
}
}
class A {
// 1、属性可以被本类或者其它类调用(第一种方法:方法中创建对象)
public void test1() {
B b = new B();
System.out.println(b.name); // jack
}
// 2、属性可以被本类或者其它类调用(第二种方法:直接传入对象)
public void test2(B b) {
System.out.println(b.name); // jack
}
}
class B {
String name = "jack";
}
1、构造器:主要作用是完成对象属性的初始化
1、如果在创建对象时,要直接给对象的属性赋值,就可以使用构造器。
2、一般给类一个无参构造一个有参构造器。
2、注意点:
1、构造器有修饰符。
2、构造器没有返回值。
3、方法名和类名一致。
4、构造器的调用,由系统完成(在new一个对象,会生成一个默认无参构造器)
5、如果指定了构造器,原来默认无参构造器被覆盖,就不可以使用了(就是你创建对象时必须赋值)
public class text {
public static void main(String[] args) {
A a = new A("张三", 20);
A a2 = new A("李四");
System.out.println(a.name);
System.out.println(a.age);
}
}
class A {
String name;
int age;
public A(String name, int age) {
this.name = name;
this.age = age;
}
public A(String name){
this.name = name;
}
}
3、细节;
1、一个类可以定义多个构造器:构造器重载。
2、构造器无返回值。
3、构造器是完成对象属性初始化,并不是创建对象。
4、创建对象时,系统自动调用该类的构造方法。
对象创建流程
1、加载类信息(Person.class),只会加载一次,就是再次创建对象也只是加载一次。
2、堆中分配空间/地址(new)。
3、完成对象初始化:
a、默认初始化:age=0;name=null
b、显示初始化:age=90;name=null
c、构造器初始化:age=20;name=小明
4、将堆中对象地址返回给对象的引用/对象名 p。
1、this关键字:
问题提出:如果将构造器中的参数名统一?
如果按照下面写法会显示null和0,因为按照作用域原则,两个name和两个age都是指的形参的name和age。那如何将左边name、age指向为类中的属性呢?
class A {
String name;
int age;
public A(String name, int age) {
name = name;
age = age;
}
}
2、this指向:
Jvm会给每一个对象分配this,因此this就指向当前对象。
class A {
String name;
int age;
public A(String name, int age) {
// this.name:就是当前对象的属性name
this.name = name;
this,age = age;
}
}
哪个对象调用,this就指向哪个对象
3、this细节:
1、this关键字可以用来访问本类的属性、方法、构造器。
2、this可以访问本类的成员方法:this.方法名(参数列表);
3、this可以在构造器中访问另一个构造器,但是必须放在第一条语句。
4、this可以访问父类的非私有属性和方法,但是是先从本类查找。
class A {
String name;
int age;
public A(String name, int age) {
this("黎明");
this.name = name; // null
this.age = age; // 0
}
public A(String name){
this.name = name;
}
public void method1() {
System.out.println("hello");
this.method2();
}
public void method2() {
System.out.println("word");
}
}
4、练习题:
public class text {
public static void main(String[] args) {
Person person1 = new Person("liming",20);
Person person2 = new Person("liming", 20);
boolean b = person2.compareTo(person1);
System.out.println(b);
}
}
class Person {
String name;
int age;
public boolean compareTo(Person p) {
if (this.name.equals(p.name) && this.age == p.age) {
return true;
} else {
return false;
}
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
1、作业:
public class Homework {
public static void main(String[] args) {
double[] array = {11.1, 23.2, 32.4, 10.1, 30.1};
Test test = new Test();
double maxnumm = test.max(array);
System.out.print(maxnumm);
}
}
class Test {
public double max(double[] array) {
double maxNum = array[0];
for (int i = 0; i < array.length; i++) {
if (maxNum < array[i]) {
maxNum = array[i];
}
}
return maxNum;
}
}
public class Homework {
public static void main(String[] args) {
String strArr[] = {"lisi", "wangwu", "zhangsan"};
Test test = new Test();
int res = test.find(strArr, "wangwu");
System.out.println(res);
}
}
class Test {
public int find(String[] strArr, String str) {
for (int i = 0; i < strArr.length; i++) {
if (str.equals(strArr[i])) {
return i;
}
}
return -1;
}
}