java是一门面向对象的语言。在面向对象的世界里,一切皆对象。
面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。
一:什么是面向过程、什么是面向对象。
①面向过程就跟传统洗衣服一样,如图 :
注重的是其中的过程,并且缺一不可,这就是面向过程
②面向对象就像是我们用洗衣机,是通过人、衣服、洗衣服、洗衣机之间交互来完成:
人只需要将衣服、洗衣服放入洗衣机,然后启动洗衣机的开关,等洗衣机工作完成,我们直接拿出来即可。
面向对象就是通过各各对象之间的交互,最后得出结果,对其中的过程并不需要了解。
二: 类定义和使用
1.什么是类
可以理解为对一个实体对象的描述。例:
点赞的各位长的像彭于晏和刘亦菲;
年龄永远都是18岁;
身高最少都是180;
学习成绩都很好、性格开朗、乐于助人;
那么在java中如何定义类呢?
2. 类的定义格式
在java中我们定义类需要class关键字。
class + 类名(类名建议使用大驼峰){
filed; //成员变量
method; //成员方法
}
注意事项:
类名注意大驼峰定义
成员方法前统一写public
3. 练习定义类
定义一个狗类:
那么狗肯定有名字、年龄,行为有吃饭和摇尾巴,那么我们就可以定义一个狗类。
定义一个学生类
学生也有姓名、年龄,还有成绩,行为有上课、考试、休息。
注意:
一般在一个java文件中只定义一个类
mian方法所在的类一般要用public修饰(Eclipse默认会在public修饰的类中寻找main方法)
public修饰的类必须要和文件名相同
不要随便修改public修饰的类的名称,如果要修改,通过开发工具修改。例:
三:类的实例化
什么是实例化
定义了一个类,就相当于在计算机中定义了一种类似于int char这样的一种类型,但是int char是自带的 类却是我们自己定义的。
用类类型创建一个对象,我们称为类的实例化。在java中要实例化就需要用到new关键字了。
就像我们刚刚创建了一个狗类,我们来创建一个对象。
在上图中我们创建一只狗子,名字我们给它叫做小黄,年龄1岁。
那么我们new是怎么创建对象的呢?我们要怎么修改对象中的属性呢?怎么调用对象中的方法呢?
类名 + 变量名 = new 类名();
变量名 + . + 属性 = 需要修改的值 ;
变量名 + . + 方法名() ;
在.了之后我们可以看到其中的属性和方法,并不用我们一个个的输入
接下来我们看看运行结果
对象是创建在堆上的,变量存的是对象的地址,所以也叫做引用变量。同时只有属性在堆上,方法则在方法区上。
注意:
new关键字用于创建一个对象的实例化
使用.来访问对象中的属性和方法
同一个类可以创建多个对象
类和对象说明
①:类只是相当于模板一样的东西。
②:类是一种自定义的类型
③:实例化的对象,占据实际的内存空间,里面存放的是成员变量
④:可以把类看成建筑设计图纸,可以根据一张图纸造出很多房子,这些房子外面基本都差不多,但是 面的风格却各不一样。
四:this引用
什么是this引用
this引用指向当前对象(成员方法运行式调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过改引用去访问。
我们看下面这段代码就了解了
class Student {
public String name;
public int age;
public void Student(String name, int age) {
this.name = name;
this.age = age;
}
public void attendClass() {
System.out.println(name + "在上课");
}
public void examination() {
System.out.println(name + "在考试");
}
}
在上面这段代码中,我们创建了一个学生类,在学生类中创建了一个方法,我们调用这个方法可以将对象中的name和age进行赋值。这就是this的作用,但是不用this好像也行耶?
如:
不使用this我们也能运行,但是在创建赋值方法时要注意参数名与成员变量名不能相同,否则就会变成
自己给自己赋值。所以为了稳妥起见我们一般在这里都会加上this。
为什么要使用this
上面说了一个是防止成员变量和参数名相同,还有一个是知道调用方法时是哪个对象在调用。
如:
class Student {
public String name;
public int age;
public void Student(String name, int age) {
this.name = name;
this.age = age;
}
public void attendClass() {
System.out.println(this.name + "在上课");
}
public void examination() {
System.out.println(this.name + "在考试");
}
public static void main(String[] args) {
Student student = new Student();
student.Student("zhangsan", 20);
student.examination();
Student student1 = new Student();
student1.Student("lisi", 19);
student1.examination();
}
}
在第22行和第23行,我们创建的两个student和student1对象,调用了examination方法
编译器是怎么知道是谁在调用呢?
通过this来判断,谁调用方法,this就会去调用那个对象的成员属性。
我们通过调试可以看到,student的地址是xxxxx@498,this表示的也是@498,这里就可以得出上面的结论。
this引用的特性
this的类型:对应类类型引用,即哪个对象调用this就是哪个对象的引用类型
this只能在成员方法中使用
在成员方法中,this只能引用当前对象,不能引用其他对象
五:对象的构造及初始化
怎么初始化对象
在java中,变量不初始化便无法使用,但是之前的成员方法也没初始化,为什么编译器没报错呢?
每次创建完对象之后,都要调用方法来给对象的属性赋值,很麻烦,有没有简洁一点的呢??
下面就来介绍构造方法的概念。
构造方法
什么是构造方法:名字与类必须相同,在创建对象时,编译器自动调用,并且在这个对象的生命周期只调用一次。
class Student {
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void attendClass() {
System.out.println(this.name + "在上课");
}
public void examination() {
System.out.println(this.name + "在考试");
}
public static void main(String[] args) {
Student student = new Student("zhangsan",18);
}
}
里面的7 -> 10行就是构造方法。
那么之前我们没创建构造方法啊,为什么编译器也没报错呢?
这是因为如果我们没创建构造方法的话,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
我们创建了一个带两个构造参数的构造方法,所以在创建对象时,调用构造方法要传入两个值来给成员变量初始化。
因为名字相同,传入参数不同,所以构造方法时可以重载的。
我们将代码改一下来看看运行结果。
class Student {
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("调用两个参数的构造方法");
}
public void attendClass() {
System.out.println(this.name + "在上课");
}
public void examination() {
System.out.println(this.name + "在考试");
}
public static void main(String[] args) {
Student student = new Student("zhangsan",18);
student.attendClass();
}
}
可以看到结果打印了调用两个参数的构造方法和zhangsan在上课,表示对象在创建过程中调用了构造方法。
注意:
构造方法的作用是给对象中的成员属性进行初始化,不负责给对象开辟空间。
构造方法名字必须与类相同
没有返回值,void也不行
构造方法在对象创建时由编译器自动调用,并且在对象的生命周期只调用一次(初始化之后要改变成员变量的值就需要通过变量名+. 来调用更改)
构造方法可以重载
没有定义构造方法时,编译器会生成一份默认的无参构造方法
大多数情况下构造方法都会使用public来进行修饰