###类与对象
概念: 类(class)和对象(object)是面向对象方法的核心概念。类是对一类事物进行描述,是抽象的、概念上的定义;对象是实际存在的该类事物的每个个体,因而也称实例(instance)
1.1 类的语法结构:
Java语言中定义类的语法如下:
[修饰符] class类名{
定义构造方法;
定义属性;
定义方法;
}
注意(类中各成员之间的定义顺序对程序没有任何影响)。
1.2 对象创建和使用
① 在Java语言中创建对象的根本途径是,通过 new关键字调用某个类的构造方法,即可创建该类的实例。创建对象的步骤如下:
(1)声明对象。对象的声明和基本类型的数据声明在形式上是一样的。具体格式如下:
类名 对象名
例如:
Hero hero;
(2)实例化对象。使用new关键字调用类的构造方法实例化对象,具体格式如下:
对象名=new构造方法()
例如:
hero= new Hero()
② 如果访问权限允许,类中定义的方法和属性都可以通过类的实例来调用。调用属性或方法时要使用“.”运算符。
(1)属性的调用,其具体格式如下:
对象名.属性
(2)方法的调用,其具体格式如下:
对象名.方法名(【参数】)
1.3 对象和引用
(1)由上图Hero对象由多块内存组成,不同内存块分别存储了Hero对象的不同属性,当把该 Hero对象赋值给一个引用变量时,系统不会将这个Hero对象在内存中重新复制一份,而是将引用变量指向该对象即可,引用变量存放的仅仅是对象的内存地址。
(2)类是一种引用数据类型,因此程序中定义的 Hero类型的变量实际上是一个引用,它被存放在栈内存中,指向实际的 Hero对象,而真正的 Hero对象则存放在堆内存中。将一个 Hero 对象赋值给一个引用变量的内存分配,如下图示
注意:(无论是数组还是对象,当程序访问引用变量的属性或方式时,实际是访问该引用变量所引用的数组、对象的属性或方法)。
1.4方法详解:
方法是类或对象的行为特征的抽象,是类或对象最重要的组成部分,通过方法可以实现对类的属性的操作。此外,其他类也可以通过某个类的方法对其变量进行访问。到目前为止,我们所接触最多的方法就是main()方法。main()方法有别于其他一般的方法,即它不需要声明就可以直接使用。
mian()方法是Java中的一个非常特殊的方法,它的命名格式是由Java内部硬性规定的,我们不能随意修改main()方法的格式。因此,main()方法不需要声明。
1.4.1方法声明
方法(method)的声明包含方法头和方法体两部分,方法的声明格式如下:
[<修饰符>]<返回类型><方法名([参数列表]){方法体}
方法说明如下:
(1)方法声明包括方法头和方法体两部分,其中方法头包括修饰符、返回类型、方法名和参数列表;方法体包括在花括号内的声明部分和语句部分,用于描述方法的功能。
(2)修饰符,表示方法的访问权限。修饰符有private、缺省访问修饰符、protected和public。
(3)返回类型,为该方法返回值的类型,如该方法没有返回值,则方法的返回类型为void。(4)参数列表,指定在调用时,应该传递的参数的个数和类型。参数列表如果包含多个参数,相邻的参数之间用逗号隔开,此处的参数在定义时并没有分配存储单元,只有在运行时间才分配,所以称为形式参数。方法也可以没有参数,称为无参方法。注意无参方法后面的一对圆括号不能省略。
(5)对于有返回值的方法,方法体中至少有一条return语句,形式为return(表达式)。当调用该方法时,表达式的值就是方法的返回值,方法返回值的类型应和表达式的类型一致。(6)方法不能嵌套定义,即不能在方法中再声明其他的方法。在程序中,方法是不可或缺的。通过使用方法可以完成特定的功能,方法一旦定义,就可以在不同的程序中多次调用,这样可以增强程序的可读性和可重用性,提高编程的效率。但对于初学者而言,使用方法时经常出现错误,尤其是在方法的声明和调用以及参数传递方面,下面我们将详细讲解方法的使用。在Hero处声明一个方法,该方法用于计算当前英雄的血量,具体操作见下例代码:
public class Hero{
//定义英雄战斗方法
public void battle (){
// 实现具体的英雄战斗的业务逻辑
}
}
1.4.2方法调用
由于 main()方法是程序的入口,如果在类中调用指定方法,则按照如下步骤进行操作:
(1)在类的main()方法中创建可以调用方法的实例。
(2)将实例赋值给指定的引用变量,通过引用“变量,方法名”的形式调用方法。调用Hero类中的battle()方法的具体操作见如下代码。
public class Hero{
String name;
int age;
public void battle(){
System.out.println(name+"在肆无忌惮地战斗,他的年龄只有"+age+",可他的血量只有1%了…");
}
public static void main(String[] args){
Hero hero =new Hero();//创建英雄对象
hero.name="暗夜魔王"; //为name属性赋值hero.age=15;//为age属性赋值
hero.battle();//使用该对象的battle
}
}
说明:
如果方法的返回类型为void,说明方法没有返回值,所以在main(方法中调用时,可以将此方法作为一条语句直接在程序中使用。
1.4.3 方法参数传递
*参数的传递是指实际参数向形参值的传递的过程。如果声明方法时包含形参的声明,则调用方法时必须为这些形参指定参数值,调用方法时实际传给形参的参数值被称为实参。那么,实参是如何传递给方法的?这是由Java方法的参数传递机制所控制的,Java中方法参数传递方式只有一种,即值传递。所谓值传递就是将实参的副本(复制品)传递给形参,而实参本身不会受到任何影响。
*
1.5 可变形参方法
可变方法声明格式如下:
[<修饰符>]<返回类型><方法名>(变量类型..变量
名)(方法体]
可变方法的特点:
(1)只能出现在参数列表的最后。
(2)“…”位于变量类型和变量名之间,前后有无空格都可以。
(3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
1.5.1 可变方法调用如下:
public class VarargsTest {
//定义形参个数可变的方法
public static void testVarargs(int x, String...users){
for (String user:users){ System.out.println(user);
}
}
public static void main(String []args) {
//采用可变个数形参的方法调用 testVarargs(3,"张小文","王艺儒","李晨生”);
}
}
1.5.2 可变参数与数组参数的区别
1.定义方式不一样(1)采用可变个数形参来定义方法,代码如下:
publicstatic void testVarargs(String. users);
(2)采用数组形参来定义方法,代码如下:
publicstatic void testArray(String[] users);
2.调用方式不一样
(1)采用可变个数形参的方法调用,代码如下:
testVarargs("张小文","王艺儒","李晨生");
(2)采用数组形参的方法调用,代码如下:
testArray(new String [] {"张小文","王艺儒","李晨生"} );
3.参数位置不同
如果有多个形参,数组形式的参数可以处于形参列表的任意位置,但是个数可变的形参处于形参列表的最后,即一个方法中最多只能有一个个数可变的形参。对比区两种方法,很显然第一种形式上更加图洁。实际上,即使是采用形参个数可变的形式来定义万法,调用方法时也一样可以为个数可变的形参传递一个数组。
1.6 构造方法
*
定义:在类定义中有一类特殊的方法,此类方法的名称与类名完全一致,在创建对象时用于对成员变量进行初始化,此类方法被称为构造方法。
*
作用:构造方法是在类中定义的特殊方法,该方法的名称与类名完全一致。构造方法的作用是创建实例对象。
如果在类中没有创建用户自定义的构造方法,Java会提供一个缺省的默认无参构造方法。利用“new构造方法([参数列表])”用于创建对象实例。