Java是一门纯面向对象的语言,什么是对象呢?其实在面向对象的世界,一切皆为对象。而我们曾经学习过的C语言是一门面向过程的语言,所以这是我们第一次认识面向对象的思想。请区分:面向过程和面向对象不是语言,而是一种思想。
类
对象的产生依赖于类,有类才有对象。我们周围可见的,都可以成为一类,如动物就是类,动物往下分,小猫小狗等等统统可以成为类,类需要我们自己去定义,我们通常用class这个关键字来定义类。类由行为和属性组成。
下面,我们用小狗来举例,创建一个类。小狗有自己的属性和行为,比如,小狗有自己的名字,年龄,颜色这样的一些属性。代码中我们叫成员变量。同时,小狗也具备类似于吃饭,喝水,汪汪叫这样的一些行为,下面我们通过代码进行定义。
public class Dog { public String name;//名字 public int age;//年龄 public String color;//颜色 public void eat(){ System.out.println("小狗吃饭"); } public void drink(){ System.out.println("小狗喝水"); } public void bark(){ System.out.println("汪汪叫"); } }
那么这样,我们就创建出了一个类,但这还不够,比如我们家有一只狗,我要在电脑上创建出我们家小狗的这样一个对象,我们所作的仅仅是定义了小狗这样一个大类,它并不能代表我们家这只小狗,而是代表“狗”这样一种概念,所以,为了创建出我们家小狗这样一个对象,我们需要对狗这个类进行实例化的操作,通过类创建出一个对象。
对象——类的实例化
我们可以通过如下代码进行类的实例化
Dog myDog=new Dog();
其中myDog代表我们家的小狗,我们使用new关键字可以进行类的实例化,这样我们就创建出了我们家小狗这样一个对象。那么我们已知我家小狗是白色,叫旺财,2岁,正在汪汪叫,我们由该如何用代码表示呢?我们可以采用.对类的属性和和方法进行调用。
public static void main(String[] args) { Dog dog=new Dog(); dog.age=2; dog.color="白色"; dog.name="旺财"; System.out.println(dog.age+" "+dog.color+" "+dog.name); dog.bark(); }
我们可以看一下执行结果
那么发现我们对我们家小狗具体的属性还有它的行为通过调用方法等进行了完善,小狗的形象更加具体了。
同时我们要注意,当我们成员变量没有被初始化时,引用类型一般为null,默认类型一般为自己的0值。
那么,对于成员变量的初始化,我们是否有更简便的方法呢,这就是我们即将介绍的构造方法,我们将用构造方法完成对对象的定义。
构造方法
构造方法是一个非常特殊的方法,这个方法的方法名与类名相同,没有返回值,当调用完构造方法之后,对象才会产生。因此Dog myDog=new Dog()并不是没有构造方法。当一个类当中没有构造方法时,Java会帮你自动提供一个不带参数的构造方法。而当一个类中有构造方法时,Java将不会再帮忙提供。没有返回值类型,设置为void也不行。
public Dog(String name, int age, String color) { this.name = name; this.age = age; this.color = color; }
这就是狗的构造方法,那么现在,当我们创建对象时,可以一并定义成员变量,就像这样。
Dog dog=new Dog("旺财",2,"白色");
这样会更加便捷。我们发现,构造方法里有this这样一个关键字,下面我们着重介绍一下this。this引用是对当前对象的引用,可以防止局部变量自己对自己赋值,我们建议习惯使用this,是一个很不错的习惯,访问当前对象的属性,一般都加上this,通过this 可以访问当前对象的成员变量。需要注意,this只能在成员方法当中使用,this只能引用当前对象。this本身代表当前对象的引用。
封装
面向对象具有三大特征:封装,继承,多态。
封装:对当前类的成员进行隐藏,通过关键字private,只是对类外提供公开的接口,可以隐藏类的实现细节,从而达到安全性。如:
private String name;//名字 private int age;//年龄 private String color;//颜色
此时我们再在main方法中写下dog.name="张三"时,编译器会报错,因为name被private修饰无法直接修改,那我们该如何进行修改呢?
java为我们提供了getter和setter方法,当然我们也可以在类当中自己定义,我们可以右键generate,选择Getter and Setter,类中就会自动创建针对每个属性的getter和setter方法,我们可以通过调用方法对属性进行访问和操作。其中getter是获取,setter是修改。
public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getColor() { return color; } public void setColor(String color) { this.color = color; }
为了对封装有进一步的认识,接下来我们要认识包。
包
包:为了更好的管理类,把多个类收集在一起成为一组。包是对类,接口等的封装机制的体现。
那么我们该如何导入包中的类呢,首先我们要进行导包
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader;
像我们代码上面经常能见到的这些,都是导包的操作,我们使用import这样的关键字进行导包。
import java.util.Arrays;导入这样一个包后,我们就可以对Arrays类进行操作
public static void main(String[] args) { int [] arr={1,2,3,4}; System.out.println(Arrays.toString(arr)); }
我们常见的打印数组的操作,就是这样完成的。
这样,我们就对类和对象有了一个最基本的认识