一文搞清楚Java中的方法、常量、变量、参数

时间:2024-01-22 10:17:17

写在开头

在上一篇文章:一文搞清楚Java中的包、类、接口
中我们讲了Java中的包、类和接口,今天继续将剩下的方法、常量、变量以及参数梳理完。

Java中的变量与常量

在JVM的运转中,承载的是数据,而数据的一种变现形式就是“量”,量分为:常量与变量,我们在数学和物理学中已经接触过变量的概念了,在Java中的变量就是在程序运行过程中可以改变其值的量。

常量

与变量相对应的是常量,所谓常量,即在作用域内保持不变的值,一般用final关键字进行修饰,通常分为全局常量、类内常量、局部常量。
【程序用例】

public class Person {
    //全局常量
    public static final String SEX = "男";
    //类内常量
    private static final String BIRTHPLACE ="安徽";

    public void method1(String str){
        //局部常量-方法常量
        final String LANGUAGE = "汉语";
    }
    
    public void method2(final int age){
        //局部常量-参数常量,不可改,这段代码会编译报错
        age = 20;
    }
}

变量

变量同样分为局部变量、成员变量和静态变量
【程序用例】

public class Person {
    //成员变量
    //在类内部但在方法体外声明的变量称为成员变量,或者实例变量,或者字段。
    //之所以称为实例变量,是因为该变量只能通过类的实例(对象)来访问。
    int data1 = 3;
    //静态变量
    //通过 static 关键字声明的变量被称为静态变量(类变量),
    //它可以直接被类访问
    static int data2 = 4;

    public int sum(){
        //局部变量
        //在方法体内声明的变量被称为局部变量,该变量只能在该方法内使用,
        //类中的其他方法并不知道该变量。
        int a = 1;
        int b = 2;
        return a+b;
    }

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.data1 == person.sum());
        System.out.println(Person.data2 == person.sum());
    }

}

【变量使用时注意事项】

局部变量
局部变量声明在方法、构造方法或者语句块中。
局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,将会被销毁。
访问修饰符不能用于局部变量。
局部变量只在声明它的方法、构造方法或者语句块中可见。
局部变量是在栈上分配的。
局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。

成员变量
成员变量声明在一个类中,但在方法、构造方法和语句块之外。 当一个对象被实例化之后,每个成员变量的值就跟着确定。
成员变量在对象创建的时候创建,在对象被销毁的时候销毁。
成员变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息。 成员变量可以声明在使用前或者使用后。
访问修饰符可以修饰成员变量。
成员变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把成员变量设为私有。通过使用访问修饰符可以使成员变量对子类可见;成员变量具有默认值。数值型变量的默认值是
0,布尔型变量的默认值是 false,引用类型变量的默认值是 null。变量的值可以在声明时指定,也可以在构造方法中指定。

静态变量
静态变量在类中以 static 关键字声明,须在方法、构造方法和语句块之外。
无论一个类创建了多少个对象,类只拥有静态变量的一份拷贝。 静态变量除了被声明为常量外很少使用。 静态变量储存在静态存储区。
静态变量在程序开始时创建,在程序结束时销毁。 与成员变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
静态变量的默认值和实例变量相似。 静态变量还可以在静态语句块中初始化

Java中的方法

何为方法?我的理解是:方法是Java中对逻辑行为的一种程序实现,通过方法的调用去实现我们想让对象所拥有的行为,比如一个对象的增删改查,只需要创建相应的方法即可!

方法的声明

在方法声明中,最重要的就是方法名(采用小驼峰命名法)与参数,这两者构成的方法的签名,是方法重载的判断依旧,除此之外,在声明方法的时候,还会设置访问权限、是否静态、返回值类型等。结构如下图:

实例方法

在类中声明,无需static、abstract等关键字修饰,创建类对象,通过对象的引用所调用的方法为实例方法,类中最为常见的一种方法类型。上代码!

public class Test {

    public static void main(String[] args) {
        Test sum = new Test();
        System.out.println(sum.add(1,2));
    }
    //实例方法,求两数之和
    public int add(int a, int b) {
        return a + b;
    }
}

静态方法

若方法的声明中加上了static关键字,静态方法是属于类的,而不是属于类创建的对象或实例的,故在调用时无需通过对象实例。

public class Test {

    public static void main(String[] args) {
        System.out.println(sub(2,1));
    }
    public static int sub(int a,int b){
        return a - b;
    }
}

【注意事项】

1、静态方法只能访问静态成员
2、调用静态方法时可能对象并没有被初始化,此时非静态变量还未初始化
3、非静态方法的调用和非静态成员变量的访问要先创建对象

抽象方法

当一个方法被关键字abstract修饰后,且没有方法体,那它就成为了一个抽象方法,抽象方法往往出现在抽象类和接口中。

/**
 * @author JavaBUild
 */
abstract class AbstractDemo {
    abstract void display();
}

【注意事项】

1、抽象类中不一定必须要有抽象方法,但是有抽象方法的类必须是抽象类
2、若一个类继承了抽象类,则必须实现抽象类中的抽象方法!
3、抽象类不能被实例化
4、抽象方法不能被声明为静态
5、抽象方法不能用 private 修饰
6、抽象方法不能用 final 修饰

native方法

我们在讲Java的Object类时,已经接触过Java中的native方法了,它们用native关键字修饰,用C/C++语言实现,声明时native关键字必须在返回值前,不能用abstract修饰、没有方法体,甚至没有大括号!

public final native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;

这类方法存在的意义是作为Java标准类库的一种扩展,或者兼容其他语言写好的且更好用的类库,或者提升程序执行效率。

构造方法

除了以上那些方法外,Java中还有一种特殊的方法,名为构造方法,用以在对象初始化工作,Java 有两种类型的构造方法:无参构造方法和有参构造方法。
当我们在一个类中不写任何构造方法时,编译器会默认一个无参构造方法,只不过这个方法是缺省的,显示不可见。
构造方法的声明规范

构造方法的名字必须和类名一样;
构造方法没有返回类型,包括 void;
构造方法不能是抽象的(abstract)、静态的(static)、最终的(final)、同步的(synchronized)。

代码示例

public class Test {
   private String name;
   private int age;
    //默认构造方法,无参构造
    public Test() {
    }
    //有参构造方法
    public Test(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public static void main(String[] args) {
        //通过无参构造创建的对象,会有默认值
        Test test1 = new Test();
        //通过有参构造方法构造的对象,在初始化时便进行了赋值
        Test test2 = new Test("JavaBuild", 18);
        System.out.println(test1.name+":"+test1.age);
        System.out.println(test2.name+":"+test2.age);
    }
}

输出:

null:0
JavaBuild:18

Java中参数

上面构造方法中提及了有参构造和无参构造,那么现在就好好聊一聊这个参数,参数应用于方法之中,作为方法运转的条件和参考,当然这仅限于有参数的方法,方法中的参数分形参和实参,形参是在方法的定义阶段,而实参则是在方法的调用阶段,参数个数不限,类型不限,可以是基本数据类型,也可以是引用类型。

可变参数
在jdk5中为了解决反射机制和printf中的问题引入了可变参数概念,顾名思义就是参数个数不确定的场景。定义方式:"参数类型...";

代码示例

public class Test {

    public static void main(String[] args) {
      countLength("a");
      countLength("a","b");
      countLength("a","b","c");
    }
    public static void countLength(String... args){
        System.out.println(args.length);
    }
}

【注意事项】

1、每个方法最多只有一个可变参数
2、可变参数必须是方法的最后一个参数
3、无法仅通过改变可变参数的类型,来重载方法
4、通过对 class 文件反编译可以发现,可变参数被编译器处理成了数组