Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。
面向对象和面向过程
注:面向过程和面向对象并不是一门语言,而是解决问题的方法,并没有好坏之分,都有其专门的应用场景。
类是用来对一个实体(对象)来进行描述的。
在Java中定义类时需要用到class关键字,具体语法如下:
//创建类
class ClassName {
field; //字段(属性)或者成员变量
method; //行为或者成员方法
}
class为定义类的关键字,ClassName为类的名字,{ }中为类的主体。
类中包含的内容称为类的成员,属性主要是用来描述类的,称之为类的成员属性或者类的成员变量。方法主要说明类具有那些功能,称之为类的成员方法。
例:
//创建一个学生类
class Student {
//属性
public String name;
public int age;
public int height;
//行为
public void attribute() {
System.out.println(name +"年龄:" + age);
System.out.println(name +"身高:" + height);
}
public void eat() {
System.out.println(name + "正在吃饭!");
}
public void learn() {
System.out.println(name + "边吃边学习!");
}
}
采用Java语言将学生类在计算机中定义完成,经过Javac编译之后形成.class
文件,在JVM的基础上计算机就可以识别了。
注:
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是Java语言自带的内置类型,而类是用户自定义的新的类型,比如上述的Student类。有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)。
用类类型创建对象的过程,称为类的实例化,在Java中采用new关键字,配合类名来实例化对象。
public class Test {
public static void main(String[] args) {
Student stu = new Student();//通过new实例化对象
stu.name = "张三";
stu.age = 18;
stu.height = 180;
stu.attribute();
stu.eat();
stu.learn();
}
}
输出结果:
注意:
.
来访问对象中的属性和方法对象的存储方式:
public class Test {
public static void main(String[] args) {
Student stu1 = new Student();
Student stu2 = new Student();
Student stu3 = new Student();
}
}
当成员变量没有初始化的时候,默认值就是对应的初始值,比如:引用类型 -> null;int -> 0;float -> 0.0f;boolean -> false;char -> '\u0000'
我们看一个日期类的代码:
public class Date {
public int year;
public int month;
public int day;
public void setDate(int y,int m, int d) {
year = y;
month = m;
day = d;
}
public void printDate() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
//构造三个日期类型的对象
Date d1 = new Date();
Date d2 = new Date();
Date d3 = new Date();
//对d1,d2,d3的日期设置
d1.setDate(2020,8,6);
d2.setDate(2021,8,6);
d3.setDate(2022,8,6);
//打印日期中的内容
d1.printDate();
d2.printDate();
d3.printDate();
}
}
以上代码定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打印,逻辑简单,没有问题。
但是要思考两个问题:
1、形参名不小心与成员变量名相同:
public void setDate(int year,int month, int day) {
year = year;
month = month;
day = day;
}
那函数体中到底是谁给谁赋值?
局部变量优先,只是形参自己给自己赋值了,根本没有赋值到成员变量中。
2、三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和printDate函数如何知道打印的是哪个对象的数据呢?
**this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。**只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
public void setDate(int year,int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}