目录
1. 面向对象的初步认知
2.面向对象与面向过程
3.类定义和使用
4.类的定义格式
练习
5.类的实例化
什么是实例化
6.this引用
为什么要有this引用
什么是this引用
this引用的特性
7.对象的初始化
默认初始化
就地初始化
使用构造方法初始化
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
如果说我想要把一头大象放进冰箱里面。
传统的思想:会去研究到底该用什么方法去放,而这就是在面向过程。
现在的思想:总共有三个对象:大象,冰箱,人,我们只需要将冰箱门打开放进去即可。整个过程是三个对象之间交互完成的,人是不需要去关注过程的,这就是面向对象。
以面向对象的方式来进行处理,就不会去关注过程,通过对象之间的交互完成即可。
类是用来对一个实体(对象)来进行描述的。主要描述该实体(对象)具有哪些属性。
比如说我今天在路上看到一个美女,我回宿舍会和我室友分享一下,她是一个什么样的发型,什么样的妆容,身材怎么样啊,穿的什么样的衣服。这个过程就是在描述实体(对象)。
在java语言中,如何对类进行定义呢?
在java中定义类时需要用到class关键字,具体语法如下
//创建类
class ClassNsme{
field; //成员变量
method: //成员方法
}
class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
采用Java语言将洗衣机类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM的基础上计算机就可以识别了。
注意事项:
1.定义一个狗类
成员变量有:名字,颜色 成员方法有:汪汪叫,摇尾巴
class dog{
public String name; //名字
public String color; //颜色
public void barks(){ //狗的属性
System.out.println(name+"在汪汪叫");
}
public void wag(){ //狗的行为
System.out.println(name+"在摇尾巴");
}
}
注意事项:
定义了一个类,就相当于在计算机中定义了一种新的类型, 与int,double类似,只不过这是java语言自带的内置类型,而类是用户自定义了一个新的类型。比如上述的dog类,有了这些自定义的类型之后,就可以使用这些类来定义实例。
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
class dog{
public String name; //名字
public String color; //颜色
public void barks(){ //狗的属性
System.out.println(name+"在汪汪叫");
}
public void wag(){ //狗的行为
System.out.println(name+"在摇尾巴");
}
}
public class test {
public static void main(String[] args) {
dog dog1 = new dog(); //通过new去实例化一个对象
dog1.name = "阿黄";
dog1.color = "黄色";
dog1.barks();
dog1.wag();
dog dog2 = new dog();//通过new去实例化一个对象
dog2.name = "赛虎";
dog2.color = "棕色";
dog2.barks();
dog2.wag();
}
}
运行结果:
注意事项:
6.类和对象的说明
先看一个小栗子
public class Date {
public int year;
public int month;
public int day;
public void setDatr(int y ,int m , int d){
year = y;
month = m;
day = d;
}
public void print(){
System.out.println(year+"年"+month+"月"+day+"日");
}
public static void main(String[] args) {
Date date1 = new Date();
date1.setDatr(1945,10,1);
date1.print();
}
}
以上代码整体逻辑非常简单,没有任何问题,一定会打印1945年10月1日
如果不小心形参名和成员变量名相同呢?
这个代码不会打印,因为它采用的是局部变量进行赋值的(局部变量优先使用)。
这个时候编译器都紊乱了,不知道该给谁赋值,成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?
一切让this引用来揭开这层神秘的面纱。
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
这时候给我们的代码加上一个this就不会出错
this一共有三种使用方法:
在java方法内部定义一个局部变量时,必须初始化,否则会报错。
成员变量不初始化是不会报错的,因为会有一个默认值,那成员变量该怎么去初始化呢?
对象初始化的几种方式
在创建成员变量的时候不对它进行初始化,这就是默认初始化,系统会根据数据类型给一个默认值。
在声明成员变量时,就直接给了初始值。
public class Date {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date(){
}
public Date(int year, int month, int day) {
}
public static void main(String[] args) {
Date d1 = new Date(2021,6,9);
Date d2 = new Date();
}
}
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
public class Date {
public int year;
public int month;
public int day;
public Date(int year ,int month ,int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("这个构造方法被调用了");
}
public void print(){
System.out.println(year+"年"+month+"月"+day+"日");
}
public static void main(String[] args) {
Date date1 = new Date(1945,9,1); //在执行这条语句的时候,调用构造方法
}
}
构造方法的特性:
构造方法是可以构成方法的重载的
public class Date {
public int year;
public int month;
public int day;
public Date(){
System.out.println("调用了带两个参数的构造方法");
}
public Date(int year ,int month ,int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("这个构造方法被调用了");
}
public void print(){
System.out.println(year+"年"+month+"月"+day+"日");
}
public static void main(String[] args) {
Date date1 = new Date(1945,9,1);
}
}
这些构造方法都可以通过编译器生成
右击屏幕会有一个生成
点击生成会有一个构造方法
注意事项:
如果用户没有自定义构造方法,编译器会生成一份默认的构造方法(不带参数)
如果用户定义了,编译器不在生成。
构造方法还可以通过this来调用其他的构造方法