1.类和对象的简易概念
类是用来描述对象的一些性质的集合,而对象就是实际的一个事物。比如在我们生活中狗就是一个对象,类就是狗的名字,年龄,颜色这些属性还有吃饭,睡觉这些动作的集合。
2.类和对象的创建
我们有如下代码:
class Dog {
public String name;
public int age;
public String color;
public void eat() {
System.out.println(name + " 正在吃饭!");
}
public void sleep() {
System.out.println(name + " 正在睡觉!");
}
}
这里我们简单创建了一个类,这个类是对狗的一些性质和动作的描述。然后我们来刨析一下其中的代码:其中name,age,color叫作成员变量,成员变量的定义是定义在类的里面方法的外面的变量叫作成员变量,区别与局部变量,局部变量是定义在方法的里面的。其中eat(),sleep()叫作成员方法,定义在类里面。
3.对创建的类和对象的使用
我们可以对类中的成员变量进行赋值和输出,如:
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "小黄";
dog.age = 9;
dog.color = "黄色";
System.out.println("名字: " +dog.name+ " 年龄: " +dog.age+ " 颜色: " +dog.color);
}
可以看到我们成功的对类中的成员变量进行了赋值和输出。但是有朋友可能会问了“
Dog dog = new Dog();” 这句话的有什么用呢?这句话的作用便是实例化对象,当我们写出来这个类之后系统是还没有为其开辟空间的,所以我们要用这句话来给成员变量分配空间将其实例化。
具体我们来看一个图:
这里我们可以看到当执行上述代码的时候在内存中为成员变量分配了空间也就是我们的对象,为局部变量dog在栈上分配了空间来存储对象的地址,这里我们称之为dog指向了对象。我们可以看到成员方法并没有在堆中申请空间,成员方法是在当你调用的时候才会申请空间的。
4.构造方法
构造方法的定义:构造方法没有返回值且方法名与类名一致,在没有自己定义构造方法时系统会默认存在一个没有参数的构造方法,但是当你写了构造方法之后系统就不会再给你提供一个没有参数的构造方法了,构造方法可以写多个。下面我们来写一些构造方法:
public Dog() {
System.out.println("没有参数的构造方法");
}
public Dog(String name, int age, String color) {
System.out.println("有三个参数的构造方法");
}
这里写了两个构造方法,其中一个是没有参数的,一个是有三个参数的构造方法。那么我们就在想构造方法该怎么去调用呢,是不是像上面调用成员方法那样去调用呢。这里我们就要讲一个非常有意思的东西了,我们前面知道 Dog dog = new Dog();这串代码的作用是实例化对象,其实这里就是调用了构造方法。我们来看运行下面这串代码会出现什么情况:
public static void main(String[] args) {
Dog dog = new Dog();
Dog dog1 = new Dog("小黄",10,"黄色");
}
我们得到了这样的结果可见,在实例化对象的时候就调用了构造方法。所以我们对成员变量的赋值便可以放到构造语句中去,如:
public Dog(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
按上述代码来写构造方法可以进行传参对成员变量进行赋值。运行后的结果为:
5.this的使用
在前面我们已经使用了this,那么使用this的作用是什么呢?1.其实我们在调用类中的成员方法的时候,成员方法的第一个参数就是隐藏的this,this指的是调用该方法的引用。当我们实例化多个对象,这些对象要调用同一个成员方法时,this便可以很好的识别是哪个引用在调用我。例如:
public Dog(String name, int age, String color) {
name = name;
age = age;
color = color;
}
我们实例化了两个对象,两个对象同时调用eat()函数。系统确能将其区分开来输出如图结果: 2.解决变量同名问题,看如下代码:
public Dog(String name, int age, String color) {
name = name;
age = age;
color = color;
}
当我们将构造方法中的this去掉之后,再次运行上面的代码就会得到如下结果
当加上this就可以解决上面的问题了,所以我们建议以后在写代码过程中,成员方法中的成员方法都加上this。