目录
引言
Java作为一门面向对象的编程语言,要理解其使用方法,首先需要清楚对象的概念。在Java中,对象是类的实例化表示,而类则是对象的模板。因此,类和对象在Java中密不可分,相互依存。
编程是为了解决现实生活中的问题,而编程语言则是对现实规律的抽象表达。要理解抽象的代码,必须首先明确代码所解决的现实问题,将问题转化为代码的逻辑结构。在Java中,类的设计和对象的创建都是为了模拟现实问题的特征和行为。
因此,对于Java的使用者而言,深刻理解对象的概念以及类与对象的关系是至关重要的。只有通过清晰的现实问题抽象和良好的类设计,才能编写出具有逻辑性和可维护性的代码。
一、理解现实生活中的类与对象
物以类聚,人以群分。这句中文俗语出自《周易·系辞上》,用于比喻同类的东西常聚在一起,志同道合的人相聚成群,反之就分开,是朋友之间门当户对、志同道合的统称。这句俗语就体现出了分类的思想,文学上不同的文学作品会被分为不同的类(小说、诗歌、散文等),生物界中的各种生物也被分为域、界、门、纲、目、科、属、种 (实质上也是类的范围的由大到小)。再往贴近我们生活的角度来说,供给我们营养的东西被称作食物,接收电能并将电能转化为其他能以实现目的的东西被称为电器,食物、电器这些都是比较大的类,实际又可以具体到小的类,比如新买回来的一袋苹果,这袋苹果就是一个类,家里面客厅和主卧侧卧装的空调也可以是一个类。类是抽象的,是人的主观将具有相同特征的事物放在一起组成的,客观上又不一定是绝对正确的。而对象是具体的不抽象的,现实生活中的对象客观的存在于这个世界上,比如你正在阅览我这篇文章所用的这台设备,或者是你手边的茶杯,这些都是具体存在于这个世界上的,有具体的重量,尺寸大小,以及它所具有的作用。
二、Java中的类与对象
在Java编程语言中,一切都是基于类的。类是用来描述对象的模板或蓝图,它定义了对象的属性(成员变量)和行为(方法)。在Java中,你可以创建多个类,并通过实例化类来创建对象,然后使用对象来调用类中定义的方法或访问类的成员变量。因此,Java程序是由一系列相互关联的类构成的。
1.类的创建
Java中用 class 关键字来声明新的类,给类中包含了相关的成员变量(属性)和方法(行为)类的创建如下:
class 类名{
成员变量;
方法;
}
class Person{//以人作为一个类
String name;//成员变量:名字
void readName(){//方法:输出名字
System.out.println(name);
}
}
2.对象的创建
对该类创建实例对象代码实现如下:
类名 对象名 = new 类名();
Person XiaoMing=new Person();//创建Person类的对象XiaoMing
简易完整代码如下:
public class Person{//以人作为一个类
public static void main(String[] args){
Person XiaoMing=new Person();//创建Person类的对象XiaoMing
XiaoMing.name="小明";//修改成员变量:赋值
XiaoMing.readName();//使用方法:执行对象行为
}
String name;//成员变量:名字
void readName(){//方法:输出名字
System.out.println(name);
}
}
输出结果:
值得注意的是在一个(.java)文件中只能出现一个public关键字修饰的类(主类),且该类名必须与文件名相同。
三、类的继承
前文在谈论现实的类与对象中,提及了食物与苹果以及电器与空调这种大类包含小类的情况,食物(大类)与苹果(小类)直接也具有共同的属性,如含有营养成分,电器(大类)和空调(小类)也有共同的行为,如需要外界供给电能消耗以实现相应功能,这种继承关系可以看作是小类拥有和大类相同的特性。在Java中,继承是一种强大的机制,它使得代码更具有组织性、重用性和扩展性。
1.代码实现继承
Java中继承的关键字是 extends 。创建一个新的类Boy,示例如下:
//public class 子类名(派生类) extends 父类名(基类,超类){
// }
public class Boy extends Person{//创建子类Boy继承父类Person的属性和行为
}
修改main函数,在main函数中创建Boy类的对象:
public static void main(String[] args){
Boy XiaoJun=new Boy();//创建Person类的对象XiaoMing
XiaoJun.name="小军";//修改成员变量:赋值
XiaoJun.readName();//使用方法:执行对象行为
}
输出结果如下:
可以发现,新的类Boy中没有定义任何成员变量和方法,但是具有Person类的成员变量和方法。通过继承,(同包下)子类可以获得父类的特征和行为。另外在子类中也可以定义特定的属性和方法,或者重写父类中已有的方法以改变其行为。方法重写(覆盖)存在于有继承关系的类之间,并且要求访问修饰符大于等于父类,返回值类型,方法名,参数类型(个数,顺序)完全一样。
定义新属性和新方法与重写父类中已有方法:
public class Boy extends Person{//创建子类Boy继承父类Person的属性和行为
int height;//新属性
public void readHeight(){//新方法
System.out.println("身高为"+height+"cm");
}
void readName(){//重写方法
System.out.println("我的名字叫"+name);
}
}
public static void main(String[] args){
Boy XiaoJun=new Boy();//创建Person类的对象XiaoMing
XiaoJun.name="小军";//修改成员变量:赋值
XiaoJun.readName();//使用方法:执行对象行为
XiaoJun.height=180;
XiaoJun.readHeight();
}
输出结果为:
在Boy类中我们重写了Person类中的readName方法,在执行方法时就只执行重写的方法。若想保留父类中被重写的方法,可用关键字super表示当前类的父类对象,只需在重写的方法中加入“super.方法名;”即可执行父类中的同名方法。
注意,每个类都会默认继承Object类。每个子类只能继承一个父类,但是子类继承父类后同样可以添加接口(接口可以添加多个),格式如下:
public class 子类(派生类) extends 父类(基类,超类) implements 接口,接口,... ,... {}
2.转型
一般情况下创建已知类的实体对象如上面已经提到过的:类名 对象名 = new 类名();
我们也可以通过继承的特性来实现转型这一作用,例如:
//父类名 对象名 = new 子类名();
Person XiaoJun=new Boy();
这一过程称作自动转型(向上转型)是指将子类对象转换为父类对象的过程,如果直接将以上转型替换原有XiaoJun对象的创建,会发现Boy类中特有的属性赋值和方法使用时会报错,而改写Person类中的readName方法却能实现,因此得出对象自动转型后只能调用子类中重写的方法。
若此时再把对象XiaoJun强制转型成为Person类的对象,操作如下:
//类名 新对象名 = (与等号左边相同类名)经过自动转型后的对象名
Boy XiaoMing=(Boy)XiaoJun;
该操作叫做强制转型(向下转型)是指将父类对象转换为子类对象的过程,经过强制转型后得到的XiaoMing对象功能上与直接创建(Boy XiaoMing = new Boy();)的对象无异。
通过向上转型,从而实现多态性。这种转型的作用是可以将不同子类的对象都当作父类对象来处理,以简化代码和提高代码的可复用性。在向上转型后,只能访问父类中定义的方法和成员变量,而子类特有的方法和成员变量将无法直接访问。
通过向下转型,以便访问子类特有的方法和成员变量。这种转型的作用是在某些特定的情况下,当我们确定一个父类对象实际上是某个子类的对象时,可以使用向下转型来恢复原本的子类类型,从而可以调用子类特有的功能。
继承关系的转型可以在处理多态性、简化代码和使用子类特有功能等方面提供灵活性和便利性。但在使用转型时,需要注意类型安全性和合理性,避免出现编译时或运行时的错误。