上一期我们了解了Java的基本语法,本期开始我们来对上一期中提到的各种概念进行补充,先来看一看变量与方法。
学习内容
- 变量的声明
- 方法的声明
- 熟记所有基本数据类型
- 两种常用修饰符的使用
准备工作
在开始之前,请先新建一个类或使用现有的类完成下面的操作。
还是先在里面写上main函数供我们执行代码。
class后接类名,例如class Funcs
[访问修饰符] [非访问修饰符] [返回值类型]后接方法名,例如public void name() {}
private int name2() {}
修饰符
对象.方法名
或对象.变量名
来访问这个对象的private或protected方法,因为这样就已经是在外面类调用方法或变量了。访问修饰符
default默认修饰符
不加任何访问修饰符即代表使用默认修饰,例如:
int defaultInt = 101;
void defaultMethod() {
}
这是一个没有任何访问修饰符的方法和变量,它们对同一个包内的类可见。
public公有修饰符
被public修饰的类、方法、变量、接口可以被任何类访问,例如public static void main(String[] args) {}
只有被public修饰,它才能被Java解释器访问执行。
int publicMethod = 11;
public void publicMethod() {
}
private私有修饰符
private是最严格的修饰符,被它修饰的类、变量、方法只能在本类内访问。
int publicMethod = 11;
public void publicMethod() {
privateMethod();
}
int privateMethod = 123;
public void privateMethod() {
}
如上所示,本类内的public方法可以访问本类内的private方法,变量也是如此。
protected受保护的修饰符
还记得吗?类的里面可以继续镶套类。因此我们用两个不同的类来演示,这里的内容超前了一些,涉及到类的声明,但不用担心,目前我们只需要了解protected修饰符的作用即可。
int publicMethod = 11;
public void publicMethod() {
privateMethod();
}
int privateMethod = 123;
public void privateMethod() {
}
像这样我们就在InnerClassB的methodB方法内声明了InnerClassA并命名为classA,现在我们可以通过classA.方法名
或 classA.变量名
来访问里面的方法或变量。
现在我们试着来看看我们访问classA内的哪些东西:
你会惊奇地发现,InnerClassB居然可以访问innerClassA的private变量,这是不是和上面说的不太一样呢?
其实并不是,因为A和B这两个类都是在同一个类Funcs下的,因此innerClassA里面的变量/方法的访问权限还是作用在Funcs并非innerClassA。
非访问修饰符
看完了访问修饰符,再来看看下面的非访问修饰符。
非访问修饰符有5种,这里先介绍其中两种常用的static和final。
static静态修饰符
- 静态变量:static 修饰符可以用来声明独立于对象的静态变量,无论一个类被$实例化$多少次,这个变量依然存在并且不发生改变。
- 静态方法:static修饰符还可以用来声明独立于对象的静态方法。静态方法只能只用静态变量与静态方法。
这里我们继续拿上面的protected修饰符用到的类举例:
static class InnerClassA {
protected int protectedInt = 233;
public int publicInt = 123;
private int privateInt = 456;
public static int staticInt = 0;
public static void add() {
staticInt = staticInt + 1;
}
}
class InnerClassB {
public void methodB() {
InnerClassA classA = new InnerClassA();
}
}
我们声明了一个变量和一个方法,它们都是静态的,因此我们在classB中用classA.add()调用A类的方法是不行的。现在我们必须用类名.变量名/方法名
来调用类的静态变量.方法。
final修饰符
final就很简单了,就三种用途:常量、方法、类
- final变量一旦赋值后,不能被重新赋值。
- 父类中的 final 方法可以被子类继承,但是不能被子类重写。
- final 类不能被继承。
只要知道final以上三个特性即可。
变量
上期提到变量有三种:局部变量、类变量、实例变量,下面我们跟着例子来详细了解它们的声明与使用。
基本数据类型
Java中有8种基本数据类型:byte(字节)、int(32位整数)、long(64位长整数)、char(Unicode字符)、short(16位整数)、boolean(逻辑,只有true和false两个值)、float(32位单精度浮点数)、double(64位双精度浮点数)。
在学习变量的同时,也将常用的数据类型嵌入其中一起学习。
局部变量
局部变量就是类的方法中的变量,它们没有初始值,需要手动赋予。
public void method() {
int abc = 10;
int abcdefg = 16;
float f1 = 1.51f;
double d1 = 2.333d;
}
像这样,我们在method这个方法里面定义了4个变量。
int是变量的数据类型,abc、abcdefg、f1、d1 是变量名,单个 = 是赋值符号,10、16、1.51f、2.333d是欲赋予的值,分号就是一句代码的句号。
实例变量
实例变量声明在类中,但不在方法、代码块内,它们与类同生共死,在类被创建之后,它们的值才被确定,但你可以提前为它们指定一个默认值,这样类被创建之后就会自动给它们赋予默认值。
public class Funcs {
public int abc = 1;
public int abcdefg = 233;
public char add = '\u0000';
public byte b = 127; // Byte的最大值
public void method() {
int abc = 10;
int abcdefg = 16;
float f1 = 1.51f;
double d1 = 2.333d;
}
}
观察一下,实例变量是声明在类下面的变量,并且可以与局部变量同名。这样的变量可以供本类内访问。
这里我们又认识了两个新数据类型:
- char可以表示任何Unicode字符,并且只能通过单引号赋值。
- byte表示一个字节,一个字节的长度是8位,但byte类型的第一位用来表示正负,故实际上只有7位数,2的7次方是128,但是byte不能表示128,因为128刚好是10000000超过了7位。
类变量(静态变量)
类变量也称静态变量,声明时常与final一起连用,静态变量在第一次被访问时创建,在程序结束时销毁,并且不管这个类被$实例化$几次,静态变量的值也不会改变。
public class Funcs {
public static boolean bool = true;
public static final String STR = "This is a text.";
public int abc = 1;
public int abcdefg = 233;
public char add = '\u0000';
public byte b = 127; // Byte的最大值
public void method() {
int abc = 10;
int abcdefg = 16;
float f1 = 1.51f;
double d1 = 2.333d;
}
}
常量
直接在访问修饰符后面加上final即可将变量变为一个常量,例如:
final int a = 1;
public final float b = 2.0f;
public static final double c = 3.0d;
再次回顾一下变量的声明,这里的a、b、c是变量名,int、float、double是变量的数据类型,而在数据类型前的就是修饰符。
方法
为什么要用方法?
例如现在我们定义一个新运算AOB,把整数A与整数B相加再乘2得到结果,很显然我们可以直接用两个变量实现。但是如果我们要在100个地方使用这个运算,那是不是要声明200个变量呢?很显然这种方法是低效的,因此我们需要一个固定的模板来简化操作。
语法
[访问修饰符] [非访问修饰符] [返回值类型] [方法名] ([参数类型 参数名称]...) {}
void代表无返回值
例如:
public void method1() {}
访问修饰符 返回值类型 方法名
public static void method() {}
访问修饰符 非访问修饰符 返回值类型 方法名
public int getId() { ... }
访问修饰符 返回值类型[整数] 方法名
参数
在实际运用中,我们可能需要参数,参数的声明很简单,在()内声明,只要仿照下面即可。
(int a) 单个参数
(int a, float b) 两个参数
(int a, int b, double c) 三个参数
如上,如果要添加多个参数,只需要像声明变量一样,分号用逗号代替即可。
返回值与return
一个新的名词:函数的返回值。
在上一期就已经初步认识了方法(函数),这里我们只需要知道怎么让函数返回一个值。
要让函数返回一个值,需要用到return 返回值;
例如:
public int getId() { return 100; }
调用方法
在同类里面可以直接通过方法名(参数)来调用方法,外部类就用变量名/类名.方法(参数)调用。
static class InnerClassA {
protected int protectedInt = 233;
public int publicInt = 123;
private int privateInt = 456;
public static int staticInt = 0;
public static void add() {
staticInt = staticInt + 1;
}
public void submit(int code) {
add();
}
}
class InnerClassB {
public void methodB() {
InnerClassA classA = new InnerClassA();
classA.submit(404);
}
public int methodB2(int a, int b) {
return (a + b) * 2;
}
}
上述代码中的add();
和classA.submit(404);
就是本类和外部类的调用。
在InnerClassB的methodB中,InnerClassA被实例化并且赋值到了classA变量上,因此我们要访问新实例化出来的类的方法或变量,就必须用class.方法名
或class.变量名
来访问。
举例实现
现在我们通过一个简单的例子,结合上面所需的知识,来完成上面举例的新定义的运算吧:
public int methodB2(int a, int b) {
return (a + b) * 2;
}
这样我们就完成了一个带有参数的函数。
补充
看到这里你可能还不明白类到底有什么用,为什么要实例化类,下一期的内容就是类与对象,这里先简单说明一下。
类就好像是计算机里已经编辑好的一张Word表单,实例化就是把它打印出来;实例变量就是在里面要填写的内容,比如姓名、年龄,给实例变量赋值就是打印出来它们就已经填好了的,但是你仍可以擦掉它们重写;而方法就是其他内容,这个整体是固定的不可改变。
因此,我们如果想要自己对一张表单进行读写,就必须先把它们打印出来,才能实际动手操作它们。
而通过变量名/类名加上一个小圆点来访问实例变量/方法,就相当于是指定了你要操作的那张表单,防止混淆要操作的对象。
也就是说,类是一个模板,可以被实例化无数次,每个实例化出来的都相对独立,也就相当于打印了好几份表单,你可以为不同表单填写不同内容。
总结
本期的内容有很多,首先八种基本数据类型要熟记,其次就是掌握变量和方法的声明,以及三种访问修饰符、两种非访问修饰符的使用。其实这些内容都只需要会用就行了,用法很容易掌握,多用几次多试几次就能领悟到。先把用法搞清楚,之后再回来了解概念就很轻松。
课后练习
- 基本数据类型有哪些?实例变量与局部变量的区别是什么?
- 若方法返回值为空,则返回值类型应该是什么?
- 有哪些修饰符,它们的区别是什么?