在上一篇文章:一文搞清楚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中对逻辑行为的一种程序实现,通过方法的调用去实现我们想让对象所拥有的行为,比如一个对象的增删改查,只需要创建相应的方法即可!
在方法声明中,最重要的就是方法名(采用小驼峰命名法)与参数,这两者构成的方法的签名,是方法重载的判断依旧,除此之外,在声明方法的时候,还会设置访问权限、是否静态、返回值类型等。结构如下图:
在类中声明,无需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 修饰
我们在讲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
上面构造方法中提及了有参构造和无参构造,那么现在就好好聊一聊这个参数,参数应用于方法之中,作为方法运转的条件和参考,当然这仅限于有参数的方法,方法中的参数分形参和实参,形参是在方法的定义阶段,而实参则是在方法的调用阶段,参数个数不限,类型不限,可以是基本数据类型,也可以是引用类型。
可变参数
在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 文件反编译可以发现,可变参数被编译器处理成了数组