一、面向对象的概念
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。
提到面向对象,自然会想到面向过程,面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤–实现, 使用的时候依次调用就可以了。面向对象则是把构成问题的事务按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,-个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到维护。面向对象的特点主要可以概括为封装性、继承性和多态性,接下来针对这3种特性进行简单介绍。
1.封装性
封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想。例如,用户使用计算机,只需要使用手指敲键盘就可以了,无需知道计算机内部是如何工作的,即使用户可能碰巧知道计算机的工作原理,但在使用时并不完全依赖计算机工作原理这些细节。
2.继承性
继承性主要描述的是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展。例如,有一个汽车的类,该类中描述了汽车的普通特性和功能,而轿车的类中不仅应该包含汽车的特性和功能,还应该增加轿车特有的功能。这时,可以让轿车类继承汽车类,在轿车类中单独添加轿车特性的方法就可以了。继承不仅增强了代码的复用性,提高了开发效率,还为程序的维护补充提供了便利。
3.多态性
多态性指的是在程序中允许出现重名现象,它指在–个类中定义的属性和方法被其他类继承后,它们可以具有不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义。例如,当听到“Cut” 这个单词时,理发师的行为是剪发,演员的行为表现是停止表演,不同的对象所表现的行为是不一样的。
面向对象的思想只靠上面的介绍是无法真正理解的,只有通过大量的实践去学习和理解,才能将面向对象真正领悟。
类于对象
类于对象的概念
面向对象的编程思想,力图人程序中对事物的描述于该事物在现实中的形态保持一致。为了做到这一点,面向对象的思想中提到了两个概念——类和对象。
类是对某一事物的抽象描述,而对象用于表示现实中该事物的个体。
对象是根据类创建的,并且一个类可以对应多个对象。
(对象是实例,而类是创建对象的模板)
举例说明:
可以将动物这类生物看作是一个类,将每一种动物(兔子,狗,猫。。。)看作对象,从猫和动物之间的关系便可以看出类与对象的关系。类是一类物体的总称,而对象是这个总称下面的各种事物。
好比图中“多边形”就是类,而里面的菱形、圆、三角形
六边形、平行四边形就是类
类的定义
-
在面向对象的思想中,最核心的就是对象。为了在程序过程中创建对象,首先需要定义一个类。
-
类似对象的抽象,它用于描述一组对象的共同特征和行为。
-
类中可以定义成员变量和成员方法,其中成员变量用于描述对象的特征,也被称作属性;成员方法用于描述对象的行为,简称为方法。
-
案例:定义一个类
class Person{
int age; //定义int类型的变量age
//定义speak()方法
void speak(){
System.out.println("大家好,我今年" + age + "岁!");
}
}
其中。Person是类名。age是成员有变量,speak()是成员方法。在成员方法speak()中可以直接访问成员变量age。
**
- 注意:在Java中,定义在类中的变量的被称为成员变量,定义在方法在的变量被称为局部变量。如果在某一个方法中定义的局部变量与成员变量同名,这种情况是允许的,此时方法中通过变量名访问的是局部变量,而不是成员变量。
**
class Person {
int age = 10; //类中定义的变量被称作成员变量
void speak(){
int age = 60; //方法内部定义的变量被称作局部变量
System.out.println("大家好,今年我" + age + "岁!");
}
}
上面代码中。在Person类的speak()方法中有一个打印语句,访问了变量age,此时访问的是局部变量age。也就是说,当有另外一个程序来调用speak()方法时,输出的值是60,而不是10.
对象的创建于使用
1、在Java程序中可以使用new关键字来创建对象:
类名 对象名称 = new 类名( ); |
---|
例如,创建Person类的实例对象代码:
Person p = new Person( ); |
---|
2、创建好对象后,可以通过对象的引用来访问所有的成员,具体格式如下:
对象引用 . 对象成员 |
---|
class Person {
int age;
void speak() {
System.out.println("我今年"+ age+"岁");
}
public static void main (String[] args){
Person p1 = new Person(); //创建第一个Person对象
Person p2 = new Person(); //创建第二个Person对象
p1.age = 18; //为age属性赋值
p1.speak(); //调用对象的方法
p2.speak();
}
}
//运行结果:
//我今年18岁
//我今年0岁
3、在实例对象时,Java虚拟机会自动为成员变量进行初始化,针对不同的类型的成员变量,JAVA虚拟机会赋予不同的初始值:
成员变量类型 | 初始值 |
---|---|
byte、short、int | 0 |
long | 0L |
float | 0,0F |
double | 0.0D |
char | 空字符,’\u0000’ |
boolean | false |
引用数据类型 | null |
上面例子中之所以对输出“我今年0岁”正是因为虚拟机自动赋予的初始值,因为p2对象我们没有对其进行赋值,虚拟机自动为p2赋值0。
4、当对象被实例化后,在程序中可以通过对象的引用变量来访问该对象的成员。需要注意的是,当没有任何变量引用这对象时,它将成为垃圾对象,不能再被利用。
5、在Java中,null是一种特殊的常量,当一个变量的值为null时,则表示该变量不指向任何一个对象。在程序运行时,当变量被置为null,被引用的对象就会失去引用,成为垃圾对象。
class Person {
void say(){
System.out.println("我爱你!!");
}
}
class Persons{
public static void main(String[] args){
Person p2 = new Person();
p2.say();
p2 = null;
p2.say();
}
}
//输出结果:
//我爱你!!
//Exception in thread "main" java.lang.NoSuchMethodError: 面向对象.Person.say()V
// at 面向对象.Persons.main(Persons.java:11)
例子中,创建了一个Person类的实例对象,并两次调用了该对象的say()方法。第一次调用say()方法时可以正常打印,但在第10行代码中将变量p2的值置为null,当再次调用say()方法时抛出了空指针异常*。在Java中,null 是一种特殊的常量, 当一个变量的值为null时,则表示该变量不指向任何一个对象*。在程序运行时,当把变量p2置为null,那么被p2所引用的Person对象就会失去引用,成为垃圾对象。
类的设计
在Java中,对象是通过类创建出来的。因此,在程序设计时,最重要的就是类的设计。
案例:
假设要在程序中描述一个学校所有学生的信息。可以设计一个学生类(Student),在这个类中定义两个属性name、age,分别表示学生的姓名和年龄,定义一个方法introduce()表示学生做自我介绍。
public class Student{
String name;
inr age;
public void introduce(){
System.out.println("大家好!我李华!");
}
}
为了便于寻找相关属性,整洁,我们在设计类名,属性名时一定要尽可能的用符合所描述物体的名称来定义!
类的封装(基础篇)
所谓类的封装是指在定义一个类时,将类中的属性私有化,即使用private
关键字来修饰。
私有属性只能中它所在类中被访问。如果外界想要访问私有属性,需要提供public修饰的公有方法,其中包括用来获取属性值的 getXXX 方法和设置属性值的 setXXX 方法。
下面我们通过一个案例来实现类的封装:
class Student {
private String name; //将name属性私有化
private int age; //将age属性私有化
// 下面是有公有的 getXxx 和 setXxx方法
public String getName(){
return name;
}
public void setName (String stuName) {
name = stuName;
}
public int getAge(){
return age;
}
public void setAge(int stuAge) {
//下面是对传入的参数进行检查
if (stuAge <= 0) {
System.out.println("对不起,您输入的年龄不合法。。。");
}else {
age = stuAge; //对属性赋值
}
}
public void introduce(){
System.out.println("大家好,我叫" + name + ",今年" + age + "岁!");
}
}
public class 类的封装1 {
public static void main (String[] ages){
Student stu = new Student();
stu.setAge(-30);
stu.setName("李华");
stu.introduce();
}
}
//运行结果:
//对不起,您输入的年龄不合法。。。
//大家好,我叫李华,今年0岁!
在案例,Student类中,使用private关键字将属性name和age声明为私有,对外界提供了几个公有的方法。其中,getName()方法用于获取name属性的值,setName()方法 用于设置name属性的值,同理,getAge()和setAge()方法用于获取和设置age属性的值。在 main() 方法中创建了Student对象,并调用setAge()方法传入一个负数-30,在setAge()方法中会对参数stuAge的值进行检查,由于当前传入的值小于0,因此会输出“对不起,您输入的年龄不合法”的信息,age属性没有被赋值,仍为初始值0。
结语
好好学习,天天向上,一起加油!!!