1.1 类和对象
- 类和对象是面向对象编程最重要、最核心的两个基本概念
- 类是对一类事物描述,是抽象的、概念上的定义
- 对象是实际存在的该类事物的每个个体,因而也称实例(instance)
1.1.1 类和对象的概念
- 对象表示现实世界中某个具体的事物
- 抽象是从特定的实例中抽取共同的性质以形成一般化概念的过程
- 类是具有共同属性和行为的对象的抽象
- 类也称为模板,因为它们提供了对象的基本框架
- 类可以定义为数据和方法的集合
类和对象的示例
类
- 类以共同特性和操作定义实体
- 类是用于组合各个对象所共有操作和属性的一种机制
对象的示例
属性
- 事物的特性在类中表示为变量
- 每个对象的每个属性都拥有其特有的值
- 属性名称由类的所有实例共享
方法
- 对象执行的操作称为方法
- 操作的具体实现
- 方法指定操作对象数据的方式
- 在得到操作请求时指定如何做的算法
方法的实例
1.1.2 类的语法结构
语法:
[修饰符]class类名
{
定义构造方法;
定义属性;
定义方法;
}
- 修饰符可以是public、final、abstract或完全省略这三个修饰符
- 类名必须是一个合法的标识符
- 类中各成员之间的定义顺序对类的定义没有任何影响
1.1.3 对象的创建和使用
声明对象
格式:类名 对象名,例如:Hero hero;
实例化对象
格式:对象名 = new 构造方法(),例如:hero = new 构造方法();
属性的调用
格式:对象名.属性,例如:hero.name=“zhang san”;
方法的调用
格式:对象名.方法名([参数列表]),例如:hero.run(30)”;
示例:创建一个英雄对象并测试该对象属性的赋值和方法调用
public class Hero {
String name; //名字
//奔跑方法
public void run(int speed){
System.out.println(speed+"m/s的速度飞速狂奔");
}
public static void main(String[] args) {
//创建英雄对象
Hero hero = new Hero();
//通过对象实例调用name属性并为该属性赋值
hero.name="黑暗游侠";
System.out.println("英雄的名字:"+hero.name);
hero1.run(60);//调用hero对象run(speed)方法
}
}
1.1.4 对象和引用
- 对象内容放在堆内存
- 类是一种引用数据类型
- 对象名是一个引用名
- 对象名存放着栈内存I栈内存
- 想比堆内存空间小但读取速度快
1.1.5 实践练习
1.2 方法的详解
- 方法是类或对象的行为特征的抽象
- 通过方法可以实现对类的属性的操作
- 功能封装
- 实现代码模块化重用
1.2.1 方法的声明
语法:
[<修饰符>] 返回类型 方法名([参数列表])
{
方法体
}
- 修饰符表示方法的访问权限。修饰符有private、缺省访问修饰符、protected和public
- 返回类型为方法返回值的类型(方法没有返回值,则方法的返回类型为void)
- 参数列表表示方法调用时应该传递的参数个数和类型。
- 定义时为形参,它没有分配内存,运行时才分配内存
- 如果有多个参数,相邻的参数之间用逗号隔开
- 对于有返回值的方法,方法体中至少有一条return语句
-
方法不能嵌套定义
示例:在英雄类中设计一个战斗方法
class Hero {
// 定义战斗方法
void battle(){
/*实现具体的英雄战斗的业务逻辑*/
}
}
1.2.2 方法调用
在main方法中调用对象的实例方法步骤:
- 在类的main0方法中创建可以调用方法的实例
- 将实例赋值给指定的引用变量,通过引用“变量.方法名”的形式调用方法
说明:如果方法的返回类型为void,说明方法没有返回值,所以在main0方法中调用时,可以将此方法作为一条语句直接在程序中使用
示例:在英雄类中定义战斗方法并测试该方法的调用
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()方法
}
}
1.2.3 方法参数传递
参数的传递是指实际参数向形参值的传递的过程。
Java中方法参数的传递方式为值传递。
将实参的副本(复制品)传入给形参
实参本身不会受到任何影响
解释:
Java中的参教传递类似于Dota游戏中英雄使用的幻象
当英雄使用幻象时就会产生一个与该英雄相同的复制品
幻象与英雄本身有相同的能力
但无论该幻象受到任何攻击和伤害都不会影响英雄本身
传入方法的是实参值的复制品,无论方法中对该复制品进行何种操作,实际参数值均不会受到任何影响
示例:方法参数传递过程结果示例
public class Parameter {
//该方法用于在方法中互换形参值
public void change(String x,String y){
String temp;//定义一个临时变量
System.out.println("***形参改变之前***");
System.out.println("x="+x+"\t"+"y="+y);
//形参值互换
temp=x;//将x值赋值给变量temp
x=y;//将变量y值赋值给变量x
y=temp;//将temp值赋值给变量y
System.out.println("***形参值互换后***");
System.out.println("x="+x+"\t"+"y="+y);
}
public static void main(String[] args){
Parameter param=new Parameter();//创建Parameter实例
String a="10",b="20";
System.out.println("---调用change()方法前---");
System.out.println("a="+a+"\t"+"b="+b);
param.change(a, b);//调用方法
System.out.println("---调用change()方法后---");
System.out.println("a="+a+"\t"+"b="+b);
}
}
分析:
在调用方法之后,a、b的值仍然为10和20
即使形式参数的值改变了,但实际参数的值不会改变
1.2.4 实践练习
1.3 可变形参方法
从JDK1.5之后,Java允许定义形参个数可变的参数,从而允许为方法指定数量不确定的形参。如果在定义防法时,在最后一个形参的类型后增加三点“…”,则表明该形参可以接受多个参数值,多个参数值被当成数组传入。
可变形参方法类似于为方法传了一个数组,且在使用方法上也和数组相同
1.3.1 可变方法声明
语法:
[<修饰符>] 返回类型 方法名 (变量类型..变量名)
{
方法体
}
可变参数只能出现在参数列表的最后
“...” 位于变量类型和变量名之间,前后有无空格都可以
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数
1.3.2 可变方法调用
示例:可变形参方法调用
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,"张小文", "王艺儒", "李晨生");
}
}
示例:采用数组形参定义方法
public class ArrayTest {
//采用数组形参来定义方法
public static void testArray(String[] users) {
//users当成数组处理
for (String user : users) {
System.out.println(user);
}
}
public static void main(String[] args) {
//采用数组形参的方法调用
testArray(new String[]{"张小文", "王艺儒", "李晨生"});
}
}
1.3.3 可变参数与数组参数的比较
1、定义方式不一样
public static void testVarargs(String…users);//可变形参
public static void testArray(Stringll users);//数组形参
2、调用方式不一样
testVarargs(“张小文”,”王艺儒”,“李晨生”;//可变形参
testArray(new String[] {“张小文”,“王艺儒”,“李晨生”});//数组形参
3、参数位置不一样
数组形式的参数可以处于形参列表的任意位置
个数可变的形参处于形参列表的最后,即一个方法中最多只能有一个个数可变的形参
1.3.4 实践练习
1.4 构造方法
1.4.1 构造方法的定义
- 构造方法是一种特殊的方法
- 它是一个与类同名且返回值类型为同名类类型的方法
- 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化当类实例化一个对象时会自动调用构造方法
- 构造方法和其他方法一样也可以重载。
1.4.2 构造方法的特点
- 构造方法的功能主要用于在类的对象创建定义时进行状态的初始化
- 构造方法的命名必须和类名完全相同。构造方法没有返回值,也不能用void来修饰在Java中普通方法可以和构造方法同名,但是必须带返回值
- 构造方法不能直接调用,必须通过new运算符在创建对象时才会自动调用
- 当定义一个类的时候,通常情况下都会显示该类的构造方法,并且在方法中指定初始化的工作也可以省略,不过Java编译器会提供一个默认的构造方法,此默认构造函数是不带参数的,而一般方法不存在这一特点
1.4.3 实践练习
总结:
- 类是具有共同属性和行为的对象的抽象,对象是类的具体实例
- 类是一个具有自身属性和行为的独立单位。方法的四个要素是:方法名、参数列表、返回类型和访问修饰符
- 构造方法是一类名称与类同名,且没有返回类型的特殊方法
- 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化
- 使用“对象名.属性”引用属性,以及“对象名.方法(参数列表)”调用方法
- 如果在定义方法时,在最后一个形参的类型后增加三点“...”,则表明该形参
-
可以接受多个参数值,多个参数值被当成数组传入