提到Java,大家都知道它是一门面向对象的语言,那么,什么叫面向对象呢,我们今天就来讨论一下。
这里举个简单的生活中的例子,假设我们要洗衣服,我们需要接水、浸泡、倒洗衣粉、揉搓、漂洗、最后晒干。这样一步一步来的工作方式我们称为面向过程,每件事都需要我们进行参与,而面向对象呢?那就简单了,我们只需要找能够完成洗衣服这件事的对象就可以了,比如我们可以找妈妈,让她给我们洗,当然了,我们也可以找全自动洗衣机,它也可以帮我们完成,我们只需要把衣服交给这些对象,然后他们会帮我们把衣服洗好,而我们不用去关心这个洗衣服的过程,这就是面向对象,需要注意的是,这些对象本身依然是面向过程的。
这样做有什么好处呢?显而易见,对于我们来说,这极大的方便了我们,我们从一个参与者变成了指挥者,就像洗衣服,我们不用去关心放多少水、浸泡多长时间、倒多少洗衣粉、搓洗的力度要多大等等,从代码层面来说,这使得我们可以放更多的心思在代码整体结构和逻辑上面,而不用去纠结各个功能的具体实现。
提到Java中的对象,我们就不得不知道类和对象的关系,
类(class)
首先要知道,类是一个抽象的概念。它指具有相同特征和相同行为的事物的合集,比如人类,就指的是人这一类动物,之所以说它是一个抽象概念,就是因为我们无法知道人类说的具体是谁,我们都是人类,但这个人类并没有具体到我们中的哪一个。而对象指的就是类的具体实例化,比如张三这个人,他是人类,同时他也是一个具体体现,张三可以是个男生,但人类就不一定是男生了。
在Java中类是构造对象的模板和蓝图,基于类创建出来的对象,都含有本类中的基本特征,这一点也很好理解。
掌握了类的基本概念,下来我们要从代码方面了解Java中类的组成:
类的格式
类的基本格式是:
修饰符 class 类名{
成员属性;
成员方法;
}
一个完整的类由类名、修饰符、成员属性和成员方法组成,其中类名需要用驼峰式命名,而成员属性和成员方法都可以是空白,那么他就是一个没有属性也没有方法的类。
类中的成员 (属性)
在类中,我们可以定义任意种属性,如下:
public class Test{
String name;
int age;
String sex;
int id;
}
这里我们就给这个类定义了四个属性,需要注意的是,这些属性都属于成员变量,就算我们不给他们赋值,系统也会帮我们自动的初始化,初始化的值随着数据类型的不同而不同,详见下表:
数据类型 | 系统自动初始化值 |
String | null |
int | 0 |
double | 0.0 |
boolean | false |
char | 空格字符 |
需要知道的是,不仅String的自动初始化值为null,所有引用类型的初始化值都为null,只是说String类型是我们用的比较多的引用数据类型,所以我在这里只列举了String的情况。
类中的这些属性会具体体现在类的对象身上,称为成员变量,这些成员变量随着对象的创建而产生,随着对象的消失而消失,同时,每一个对象的属性都是各自的,比如对象1的name是张三,对象2的name可以是李四,二者互不影响。
类中的成员 (方法)
在类中,我们不但会定义成员变量,还会定义一些方法,定义方法的格式是:
修饰符 void 方法名(参数列表){
方法体;
}
方法被调用一次,方法中的方法体就会被执行一次,我们可以把重复使用的代码放进方法中,当我们需要使用时就调用它,这样我们就只用写一份代码,增强了我们代码的复用性和简便性,极大的减少了重复代码。
需要注意的是,方法之间是平级的关系,他不像之前说的循环结构和判断结构一样可以嵌套,方法是不可以嵌套的,不过一个在一个方法中可以调用另一个方法。比如:
public static void Test1(){
Test2();
}
public static void Test2(){
System.out.println("这是方法2");
}
这样使用方法1调用方法2是可以的,但是在方法1里面写方法2就不行。
我们也可以在方法中定义变量,在方法中的变量称为局部变量,随着方法的调用而产生,随着方法执行完毕而消失,并且这些变量只在该方法的范围内有用,方法外的程序访问不到,这里和循环中的局部变量是一个意思。需要注意的是,这些局部变量系统并不会帮我们进行初始化,我们在使用的时候要先手动进行初始化,否则就会报错。
类中的成员 (构造方法)
构造方法是类中比较特殊的一类方法,它主要用于创建对象时的初始化,在创建对象的时候会先运行构造方法,他的格式是:
类名 (参数列表){
方法体;
}
这里构造方法的名字必须和类名相同,同时可以有多个构造方法,不过他们的参数列表不能相同,否则就会报错。
可能你发现了,我在上面类的格式中并没有写构造方法,这是因为当我们不写构造方法时,系统会给我们自动生成一个无参的构造方法,并且是隐式的。只有当我们自己手写有参构造方法时,这个无参构造才会消失,这时如果我们还需要无参构造,那么我们就需要自己手动写一个无参构造。
类中的成员大概就是这些,我们下来介绍我们的对象
万物皆对象
我们已经基本了解到,类是具有相同特征和行为的事物的合集,是一个抽象的概念,而对象就是类的实例化,类的每个对象都具有相同的属性,但是又各自具有各自的特征。一个类的对象可以拥有本类中的所有属性和方法,我们可以通过这个类的对象来调用这些方法。
在使用方法前,我们需要知道怎样创建一个对象,在这里,我们需要用到关键字new
没有对象?new一个!
创建对象的格式为:
类名 对象名 =new 类名(参数列表);
在这个格式中,只有对象名我们可以自己起,其他的都要严格按照格式来写,你创建的是哪个类的对象,你就哪个类名。
当你正确的写出这样一条语句时,就说明你已经创建好了一个对象,接下来我们就可以使用这个对象来调用方法了,用代码举个例子:
public class Test{
public static void main(String []args){
Test t1 =new Test();
t1.show();
}
public void show(){
System.out.println("这是show方法");
}
}
这里我用Test这个类创建了一个叫做t1的对象,我们可以看到,在Test这个类中,有一个show方法,那么我就可以使用这个t1对象来调用show方法,当然,我也可以new多个对象,这些所有的对象也都可以调用show方法。
这里我们只是写了简单的方法帮助大家理解,在Java自带的核心类库中,很多的类和方法都是开发人员写好的,我们只需要搞清楚某些类中有些什么方法,有着哪些属性,能明白处理一个问题可以使用那些工具类,这就可以了。
比如我们需要返回一个0~1之间的随机数,我们就只需要调用Math.Random()方法就行了,至于这个方法中是怎样的逻辑,怎样的写法,这不需要我们操心,这就是面向对象的java,是不是感觉突然简单起来了呢,当初我理解到这一层时,也以为我悟了,但越学越发现,Java能作为一个流行这么久的语言,其实并没有我想的那么简单,不过这些都是后话。
对象的属性(成员变量)
既然我们已经知道怎么创建一个类的对象,那么我们就要更深刻的理解一下上文提到的成员变量,
1.成员变量会被自动初始化:
我们先将上面的代码优化一下:
public class Test{
int id;
String name;
public static void main(String []args){
Test t1 =new Test();
System.out.println(t1.id);
System.out.println(t1.name);
}
public void show(){
System.out.println("这是show方法");
}
}
我们在这里添加了两个属性:id和name,注意,我在这里并没有对这两个变量进行赋值,那么结合上文我们知道,系统会自动给成员变量初始化,那么当t1被创建时,t1中的id和name就已经被初始化好了,所以我们这里分别输出的是0和null。当然,我们在后面可以对他进行赋值或者更改,这都是可以的。
2.每个对象的成员变量都是属于自己的:
我们现在增加一个对象:
public class Test{
int id;
String name;
public static void main(String []args){
Test t1 =new Test();
t1.name="张三";
t1.id=001;
Test t2 =new Test();
System.out.println(t1.id);
System.out.println(t1.name);
System.out.println(t2.id);
System.out.println(t2.name);
}
public void show(){
System.out.println("这是show方法");
}
}
我们又创建了一个t2对象,并且我们对t1进行了赋值,但对t2没有任何操作,这个时候我们分别输出他们的值,我们会发现,t1的name和id分别变成了张三和001,但t2的name和id依然是null和0。
也就是说,这两个对象的属性都是属于他们自己的,一人一份,更改其中一个并不会影响其他的对象,所以我们对对象进行赋值时,一定要将每个对象都进行赋值操作。
总结
到这里,我们已经基本了解了类和对象的关系,其实类就是对象的模板,通过这个模板可以创建出很多的对象,但他们各自的属性可能不同,就好比一个汽车类。我们在类中规定汽车需要有轮胎,有发动机等等,但是不同的车的轮胎可以是不一样的,发动机也可以是不一样的,但是他们都属于汽车这个类,想必这样说,大家就都可以理解了吧?
面向对象本身就是一个抽象的概念,在后面我们还会接触到多态和抽象类,接口等等,都很抽象,如果你看了这篇文章还感觉到云里雾里,很正常,面向对象这里的知识,第一遍接触的同学要说一次就理解掌握,不说不可能,也是比较难的,不用着急,我们继续往后学习,等到整体的把面向对象学习一遍之后,回过头来就发现,我们现在的疑惑和不解就都解开了,加油吧同学们!我们一起努力,一起进步。