1、面向对象
面向对象是解决问题的一种思想,主要依靠对象交互完成一件事情。在这一思想中,我们只关心完成这件事情的对象,并不关心完成这件事情的过程。例如:完成洗衣服这件事,我们只要负责把衣服丢进洗衣机里漂洗,其中的对象就是:人、衣服和洗衣机。Java就是一门面向对象的语言,那么Java是如何产生对象的呢?让我们接着往下看!
2、对象的产生
在Java中,对象的产生依赖于类。我们可以通过class+类名来创建一个类,在类中我们可以创建对象的一些特性(成员变量也可称为属性)和对象的一些行为(成员方法),通过文字说明未免过于抽象,我们还是通过代码来进行理解。下面是创建一个洗衣机对象的代码:
class WashMachine{
//属性(成员属性):定义在类里边方法的外边,而局部变量定义在方法内部
public String brand; //品牌
public String type; //型号
public String color; //颜色
//行为(成员方法)
public void washCloths(){//洗衣服
System.out.println("洗衣服");
}
public void dryCloth(){//甩干
System.out.println("甩干");
}
}
注意:成员变量可以不赋值,Java会给它们赋初值,基本类型赋值为0,String类型会被赋值为null 。
通过上述代码就产生了洗衣机这个类,那么我们应该怎么访问它里面的属性和方法呢? 在Java中,我们通过对象的引用来访问对象的属性和方法。要访问类中的属性和方法,我们首先得进行类的实例化。可以通过new关键字来完成类的实例化:
WashMachine washMachine = new WashMachine();//类的实例化
实例化这个过程其实就是创建一个引用变量(washMachine)再让它指向对象(WashMachine),下面我们通过画图来帮助理解实例化这个过程:
每new一个对象都会为这个对象开辟一块内存,即不仅要在栈上开辟一块内存存储这个引用变量,还要在堆中开辟一块内存存储它的属性和方法。在Java中,我们通过引用.属性(成员方法)来访问对象中的成员属性和方法,代码如下:
public static void main(String[] args) {
WashMachine washMachine = new WashMachine();//类的实例化
washMachine.brand = "美的";//品牌
washMachine.color = "白色";//颜色
washMachine.type = "BIG";//型号
//输出属性
System.out.println(washMachine.brand);
System.out.println(washMachine.color);
System.out.println(washMachine.type);
//洗衣服
washMachine.washCloths();
//甩干
washMachine.dryCloth();
}
}
3、this关键字
在介绍this关键字的作用前,我们先来看一段错误的代码。
注意:这是一串错误的代码,这串代码想实现的功能是:给成员属性赋值
class WashMachine{
//属性(成员属性):定义在类里边方法的外边,而局部变量定义在方法内部
public String brand; //品牌
public String type; //型号
public String color; //颜色
//给属性赋值
public void getSome(String brand,String type,String color){
brand = brand;
type = type;
color = color;
}
这是这段代码输出的结果:
为什么会输出这样的结果呢?这是因为Java语言的就近原则,在方法的参数与属性同名时,优先会给距离近的一方赋值,这个方法的实现也就变成了参数给参数赋值,因此对象的属性仍然是初始值null。
解决这个问题一共有两个方法:1、改变形参的值,让它不要和属性同名。2、使用this关键字。(建议使用第2种方法,它的代码可读性更高)。
代码如下:
class WashMachine{
//属性(成员属性):定义在类里边方法的外边,而局部变量定义在方法内部
public String brand; //品牌
public String type; //型号
public String color; //颜色
public void getSome(String brand,String type,String color){
this.brand = brand;
this.type = type;
this.color = color;
}
这里this关键字代表的是当前对象的引用,也就是谁调用这个getSome这个方法就代表谁,通过this关键字可以访问当前对象的成员属性和成员变量(静态的成员变量/方法不支持)。
注意事项:1、this的类型:哪个对象调用就是哪个对象的引用类型。
2、this只能在方法中使用。
3、在方法中,this只能引用当前对象,不能再引用其他对象。
4、构造方法
构造方法的作用是对对象中的成员进行初始化,构造方法的方法名和类名必须相同,且构造方法没有返回值,下面是一个构造方法的代码:
public WashMachine(String brand, String type, String color) {
this.brand = brand;
this.type = type;
this.color = color;
}
可以看到,当我们写完构造方法之后,main方法中实例化对象的代码开始报错了,这时候我们需要把参数给它补上去,就可以解决错误。
很多同学可能会感到奇怪,为什么刚才没有构造方法的时候,不填参数没有报错?这是因为:当一个类中没有任何一个构造方法的时候,Java会自动提供不带参的构造方法 ,而当一个类中,有一个构造方法的时候,Java就不会再给你提供构造方法了。当调用完构造方法之后对象才产生了。
那么这时候我们想调用不带参的构造方法应该怎么办呢?其实,构造方法和普通方法一样,都是可以构成重载的(方法名相同,参数列表不同)。我们只要在类中再写一个空构造方法,就可以解决这个问题了。
public WashMachine() {//空构造方法
}
除此之外,我们还可以通过this(参数),来调用类中的其他构造方法 。(只能放在构造方法内部,且只能放在第一行)。例如:要在空构造方法中调用上面三个参数的构造方法,代码如下:
public WashMachine() {
this("美的","big","黑色");
}
最后,我们知道了在Java中完成一个对象的构造,主要分两步:1、分配内存。2、调用合适的构造方法(看类实例化时所带的参数个数)。