四、Java 类和对象以及变量
Java 是面向对象的编程语言,类是面向对象的重要内容,可以把类当成一种自定义类型,可以使用类来定义变量,这种类型的变量统称为引用变量,也就是说所有类都是引用类型。
4.1定义类
面向对象编程中有两个重要概念:类(class)和对象(object,也被称为实例,instance),**其中类是一批对象的抽象,可以把类理解成某种概念;对象才是一个具体存在的实体。**例,平时吃的水果就是一个抽象的类,而具体的苹果、橘子、香蕉之类的才是类包含的具体存在的实体。
4.1.1定义类
简单语法如下:
[修饰符] class 类名
{
构造器定义
成员变量
方法
}
上面的修饰符可以是 public、final、abstract 或者忽略
对于一个类定义而言,包含三种最常见的成员:构造器、成员变量和方法。
- 成员变量:用于定义该类或该类的实例所包含的状态数据
- 方法:定义该类或该类的实例的行为特征或功能实现
- 构造器:构造该类实例,Java 通过使用 new 来调用构造器,从而返回该类的实例
4.1.2定义成员变量
语法格式如下:
[修饰符] 类型 成员变量名 [=默认值];
**修饰符:**可以是 public、protected、private、static、final,其中public、protected、private 只能出现其一,可以和 static、final 组合起来修饰成员变量。
**类型:**可以是任何类型,包括基本类型和引用类型。
**成员变量名:**合法的标识符即可。
4.1.3定义方法
语法格式如下:
[修饰符] 方法返回值类型 方法名(形参列表)
{
//方法体
}
**修饰符:**可以是 public、protected、private、static、final、abstract,其中public、protected、private 只能出现其一;abstract 和 final 只能出现其一,它们可和 static 组合来修饰方法。
方法返回值类型:可以是任何类型,包括基本类型和引用类型。 如果声明了方法返回值类型,则方法体内必须有一个有效的 return 语句。倘若一个方法没有返回值,则必须使用 void 来声明没有返回值。
**形参列表:**用于定义该方法可接受的参数。(调用该方法必须传入对应的参数值)
4.1.4定义构造器
语法格式如下:
[修饰符] 构造器名(形参列表)
{
构造器执行体
}
**修饰符:**可省略,可是public 、protected、private 其一
**构造器名:**必须和类名相同
**形参列表:**和定义方法形参列表的格式完全相同
注:构造器既不能定义返回类型,也不能使用 void 声明没有返回值;如果做了以上两件任一,编译不会出错,但 java 会把构造器当成方法来处理,它就不是构造器了。
4.2定义基本的使用
//定义一个Person类
public class Person {
public String name;
public int age;
public void say(String content)
{
System.out.println(content);
}
public static void main(String[] args) {
//定义拍变量同时为p变量赋值
Person p = new Person();
//由于没有定义构造器,Java提供默认的构造器,输出为null也就是没有值的
p.say(p.name);
//访问p的实例变量,直接赋值
p.name = "BGR";
p.age = 21;
//调用say()方法
p.say(p.name);
//下一行代码是错误的,因为传入的实参类型和方法的形参类型没有保持一致
//p.say(p.age);
//也可以直接进行实例变量的输出
System.out.println(p.age);
}
}
/*res:
null
BGR
21
4.3方法的参数传递机制
Java 里的方法是不能独立存在的,调用方法也必须使用类或对象作为主调者。如果声明的方法中有形参声明,则在调用方法时必须给这些形参指定参数值,调用方法时实际传给形参的参数值也被称为实参。
Java 里的方法的参数传递方式只有一种:值传递——就是将实际参数的副本(也就是复制品)传入方法内,而参数本身不会受到任何影响。
4.3.1形参个数可变方法
Java 允许定义形参个数可变的参数,从而允许为方法指定数量不确定的形参。在定义方法时,在最后一个形参的类型后增加(…),则表明该形参可接受多个参数值,而多个参数值将被当成数组传入。以下是代码:
public static void test(int a, String... books) {
//输出传入的多个参数
for (String book : books) {
System.out.println(book);
}
System.out.println(a);
}
public static void main(String[] args) {
//调用test方法,并传入参数
test(3, "BGR", "爱学习", "Java");
}
/*res:
BGR
爱学习
Java
3
4.3.2方法重载
Java 允许同一个类里定义多个同名方法,只要形参列表不同就行。这种一个类中包含多个方法的方法名相同,但形参列表不同,则被称为方法重载。以下是重载的代码:
public class Demo {
public void test() {
System.out.println("无参数");
}
public void test(String msg) {
System.out.println("重载的test方法:"+msg);
}
public static void main(String[] args) {
//调用test方法,并传入参数
Demo d = new Demo();
//调用无参数的test方法
d.test();
//调用有参数的test方法,并传入字符串
d.test("Java");
}
}
/*res:
无参数
重载的test方法:Java
4.4成员变量和局部变量
java 中,根据定义变量位置不同,可将变量分为两大类:成员变量和局部变量。
成员变量指的是在类里定义的变量;
局部变量指的是在方法里定义的变量。
其中类变量可以理解为类的成员变量,因为它是和类本身共存亡;实例变量可理解为实例的成员变量,因为它和实例共存亡。
局部变量根据定义形式不同,分为以下三种:
- 形参:在定义方法签名时定义的变量,作用域是整个方法内有效
- 方法局部变量:在方法体内定义的局部变量,作用域是从定义该变量的地方生效,到该方法结束时失效
- 代码块局部变量:在代码块体内定义的局部变量,作用域是从定义该变量的地方生效,到该代码块结束时失效
注,局部变量必须显式初始化,否则不能进行访问。
代码如下:
public static void main(String[] args) {
{
//定义一个代码块变量a
int a;
//下面代码会出现错误,因为a还未进行初始化
// System.out.println(a);
//为a变量赋值,也就是初始化
a = 5;
System.out.println(a);
}
//下面错误,因为a只在代码块中存在,出了代码块便不存在了
//System.out.println(a);
}
/*res:
5