首页 > 编程语言 >一文搞清楚Java中的方法、常量、变量、参数

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

时间:2024-01-22 09:01:23浏览次数:29  
标签:搞清楚 常量 构造方法 int static Java 方法 public 变量

写在开头

在上一篇文章:一文搞清楚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 文件反编译可以发现,可变参数被编译器处理成了数组

标签:搞清楚,常量,构造方法,int,static,Java,方法,public,变量
From: https://www.cnblogs.com/JavaBuild/p/17977975

相关文章

  • Java 缓存池
    使用==对比的时候要注意,区分是int、Integer、newInteger。若是和int对比,不管是常量池还是堆的都会拆分成int,得到为true。若是和Integer对比,则要注意是否在缓存的范围之内即可。在java7之后,调用string.intern会判断字符串对象是否存在于缓存池,如果存在直接返回缓存池结果,如......
  • Java学习日记 Day6 JavaSE完结,步入正轨!!
    JavaSE:--------多线程--------①线程:线程在java中也是对象,也要创造线程类。②创建线程的三种方式:继承Thread:Thread是Runnable的实现类,而线程类进一步继承Thread类。实现Runnable:线程类直接对Runnable类进行实现。实现Callable:线程类实现Callable类。③线程的生命周期:线程从......
  • JAVA常用编码介绍
    ASCII码(最先采用的编码方式,专为英语使用)Unicode(为了克服ASCII码的缺点,方便其他国家使用,创造了Unicode意为统一编码的意思)UTF-8编码(为了克服Unicode编码的缺点:所有字符都用两个字节表示,浪费存储空间。为了节省空间又创造了UTF-8编码)......
  • Java基础语法
    Java基础语法基础阶段1、注释、标识符、关键字注释平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了。注释并不会被执行,是给我们写代码的人看的书写注释是一个非常好的习惯Java中的注释有三种:单行......
  • JAVA数据类型
    所有数据类型基本数据类型间的转换->自动类型转换->强制类型转换->基本数据类型间转换练习题基本数据类型和String类型间的转换->基本数据类型转为String类型->String数据类型转为基本数据类型......
  • 关于Java 数组
    了解Java数组Java中的数组是一种强大而灵活的数据结构,让我们一起深入探讨它的方方面面,从基础的概念到高级的应用。1.数组的创建与初始化首先,我们来看如何创建和初始化一个简单的整型数组:publicclassArrayExample{publicstaticvoidmain(String[]args){......
  • Java_讨论类加载器的双亲委派机制
    双亲委派机制简而言之,当某个类加载器在接到加载请求时,优先会将任务委托给父类加载器,一直到最顶层的类加载器,如果不能成功加载,才会尝试自己加载java.lang.ClassLoaderprotectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{synchron......
  • Java中内部类的使用总结
    ​ 参考文档:Java中内部类的使用总结-CJavaPy1、非静态内部类非静态内部类,也就是成员内部类,是定义在另一个类内部的非静态类。这种内部类与外部类之间有着密切的联系,它可以访问外部类的所有成员(包括私有成员),同时外部类也可以访问内部类的所有成员(包括私有成员)。publicclass......
  • Java中遍历方法对比
    DemopublicclassTest{publicstaticvoidmain(String[]args){test(10);test(100);test(1000);test(10000);}publicstaticvoidtest(intsize){//1.组装数组List<String>list=list(siz......
  • javascript中apply的用法
    javascript中apply的用法欧方2023-03-3118:30江苏在JavaScript中,apply方法和call方法类似,都是用于调用一个函数或方法,不同之处在于apply方法接受一个参数数组作为函数的参数列表。apply方法的语法如下:function.apply(thisArg,[argsArray])其中,t......