1.方法重载
1.1 为什么需要方法重载
在一个类中可以有很多的方法,并且每一个方法都有自己的功能,但是方法太多,对开发人员不友好,名字太多不好记,所以使用方法重载,控制每个方法传入的参数,并且方法的名字都一样,java会自动根据传入参数的不同,调用参数相对应的方法。开发者不需要再记各种方法的名字了。
1.2 什么是方法重载
在一个类中,方法名相同,参数不同(个数不同,类型不同,次序不同),构成方法重载。
方法重载只与方法名和和参数有关,与访问修饰符,返回值,方法参数名没有关系。
作用:方便使用者调用方法
public class JiaFa {
public void add(int x,int y){
System.out.println(x+y);
}
public double add(double x,int y ){
return x+y;
}
public void add(int x,double y){
System.out.println(x+y);
}
public void add(double x,double y){
System.out.println(x+y);
}
public void add(String x,String y){
System.out.println(x+y);
}
}
public class Test {
public static void main(String[] args) {
JiaFa jf = new JiaFa();
jf.add(1,2);
double a = jf.add(1.2,2);
System.out.println(a);
jf.add(3,2.1);
jf.add(23.2,89.09);
jf.add("1","3");
}
}
如果方法名相同,参数列表也相同,此时虚拟机就要做选择题,但虚拟机无法分辨到底调用哪种方法。
方法重载考虑返回值,不考虑参数名,不考虑访问修饰符。
2.包和访问修饰符
2.1 包
包作用:用于分门别类,不同功能的类放在不同的包中用于区分。
(1)为什么需要包
1)没有包的话,类多的时候不好找,所以包的作用在于管理类。包在磁盘上体现就是文件夹。
2)不同包下的类可以重名(同一目录类不能重名)。
3)可以通过包做一些限定
(2)包的定义语句:package 包名;
(3)跨包请求的时候需要导入包:import 包名.类名;导入指定类import 包名.*;
package com.yzh.test4.ali;
public class FaceRec {
public void work(){
System.out.println("使用阿里的人脸识别");
}
}
package com.yzh.test4.baidu;
public class FaceRec {
public void work(){
System.out.println("使用百度的人脸识别");
}
}
package com.yzh.test4.test;
//import com.yzh.test4.ali.FaceRec;
//import com.yzh.test4.ali.FaceRec;
public class Test {
public static void main(String[] args) {
//通过包名来限制类
com.yzh.test4.ali.FaceRec fa = new com.yzh.test4.ali.FaceRec();
fa.work();
com.yzh.test4.baidu.FaceRec fa2 = new com.yzh.test4.baidu.FaceRec();
fa2.work();
}
}
2.2 权限/访问范围修饰符
使用修饰符定义了类和类中的字段或方法时。就可以限定该类或类中字段或方法能被哪些范围的类或哪些方法来使用。
类的修饰符(两种):public(所有包中都可以访问) 默认(不写的时候就是默认,同包下的类可以访问,其它包的类不能访问)
类中属性/方法的修饰符(四种):public(公有,主要修饰成员变量和方法) protected(受保护) 默认 private(私有)
作用:权限的设置,保护属性不被外界侵犯。
权限 | 同一类 | 同一包 | 不同包的子类 | 所有类 |
public | 允许 | 允许 | 允许 | 允许 |
protected | 允许 | 允许 | 允许 | 不允许 |
默认 | 允许 | 允许 | 不允许 | 不允许 |
private | 允许 | 不允许 | 不允许 | 不允许 |
3.static(静态的)关键字
⽤来修饰属性(成员变量),则该属性就成为类属性(不依赖于某个对象⽽存在),所有该类的实例对象都共⽤这⼀个属性,任何⼀个实例改变了静态属性值,⼤家看到的都是修改过的值。在内存中static属性是所有类实例共有的内存地址。static来修饰⽅法,则该⽅法就成为静态⽅法,可以直接通过类名访问,⼀般在⼯具类中定义⼯具⽅法。
3.1 静态变量和实例变量的区别:
(1)实例变量,依赖于实例对象⽽存在。访问实例变量的时候,必须通过实例对象来访问
(2)实例变量,在内存中可以有多份(内存中创建了多少实例对象,就有多少实例变量),每个实例对象的实例变量互不影响。
(3)静态变量,不依赖于对象⽽存在。直接与类关联,可以通过类名来访问。
(4)静态变量,在内存中只有⼀份,被所有实例对象共享。
public class MyCls {
//实例变量x
int x;
//静态变量num
static int num;
//实例方法/普通方法
public void test(){
//实例方法可以访问实例变量,也可以访问其他实例方法
System.out.println(this.x);
//实例方法可以访问静态变量
System.out.println(MyCls.num);
//实例方法可以访问静态方法
aaa();
}
public void bbb(){
}
//静态方法
public static void aaa(){
//静态方法不能访问实例属性/变量
//System.out.println(x);
//静态方法可以访问静态属性/变量,也可以访问其他静态方法
System.out.println(num);
//静态方法不能访问实例方法
//bbb();
}
}
3.2 static特点:
所有的静态(静态变量和静态方法)都属于类(全局)
(1)静态属性和静态方法可以直接通过 类名.静态属性 类名.静态方法()来使用,这是推荐的方式。也可以通过实例对象来访问静态属性和静态方法。但是这种做法不推荐。
(2)静态方法中,只能访问静态属性和其它静态方法。不能访问实例属性和实例方法。
(3)实例方法中,可以访问静态属性和静态方法,也可以访问实例属性和实例方法。
(4)静态代码块在类被加载时自动调用。只会在类加载时执行一次。
public class MyClass {
//实例代码块:每次创建对象的时候,都会在构造方法之前执行一次
{
System.out.println("实例代码块被执行");
}
//静态代码块:只在加载类的时候,执行一次
static {
System.out.println("静态代码块被执行");
}
public MyClass(){
System.out.println("构造方法执行");
}
}