目录
(2)构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
(3)静态块: 使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
一.什么是面向对象
Java是一门纯面相对象的语言(Object Oriented Program,继承OOP),在面相对象的世界里,一切皆为对象。面相对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面相对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
1.对象的概念:
在我们的生活中一切物体都可以被抽象为对象,例如人,手机,电脑等都可以看作是一个个对象
2.为什么要引入面向对象
因为在计算机在进行编程时有两种解决问题的方法,一种是面向过程,第二种就是面向对象来进行编程,那么这两种解决问题的方法有什么区别呢?
面向过程主要关注的是做事情的每一步的过程从而解决问题,而面向对象只是通过对象之间的交互来进行解决问题。如果这里没有懂,接下来我举一个例子来更好地进行理解。
在日常中,我们洗衣服可以使用手洗,也可以使用洗衣机来进行洗。
(1)手洗大概需要经过以下步骤才能进行洗干净
拿盆---->放水---->放衣服---->放洗衣液---->手进行揉搓---->换水接着揉搓---->拧干晾晒
(2)洗衣机来进行洗
在这里,手洗相当于是面向过程来进行解决问题,其中必须按照每一步来进行解决,否则就完成不了这件事;洗衣机洗相当于是面向对象来进行解决问题,这里我们把这几种事物抽象为对象,通过对象之间的交互来进行解决问题。
这里的两种方法没有在解决问题中没有最好的区分,需要我们在具体问题中来自己进行判断到底使用哪种方法来解决问题是比较好的。
知道了什么是面向对象,那么这种方法是如何在Java中使用呢,我们要想把显示生活中的对象抽象出来使用,那就要知道对象中具体有什么东西,这样计算机才能够进行识别和使用,接下来就是通过类来进行实现。
二.类的定义和使用
1.类的概念
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。
例子.上面所说的洗衣机,你要向将它定义成一个类,就需要知道这个洗衣机具有哪些参数,例如颜色,大小等;它具有什么功能,例如可以进行洗衣服,可以进行甩干,消毒等;我们需要将这些抽象成一个类,这样计算机就可以知道什么是洗衣机了。
知道了类是干什么的了,接下来就要知道类是如何进行定义。
2.类的定义
格式:
class关键字加类名(注意:类名首字母需大写)
类的里面就是这个对象的属性(字段或者成员变量)和功能(成员方法)。
这里我将上面的洗衣机抽象成一个类来进行使用。
class WashMachine{
public int size;//大小
public String color;//颜色
//进行洗的功能
public void wash(){
System.out.println("可以洗衣服");
}
//进行甩干
public void spinDry(){
System.out.println("甩干");
}
}
这里需要注意的几点是:
(1)这里的pulbic是修饰符,在这里的成员前先都使用pulbic,在这里先不用太关注,后面会说。
(2)在这里的方法没有带static关键字,在后面会详细介绍该关键字如何进行使用。
(3)对于被public修饰的类我们必须要与文件名保持一直,否则会出现错误。
(4)一个文件一般只定义一个类,这是一种Java习惯。
三.类的实例化(对象的创建)
1、类的实例化概念和例子
我们把类定义好了,但是如何进行使用呢,接下来通过类的实例化来进行使用,在实例化之前,我们需要知道这里的类是一种用户自定义的一种类型,和那些基本数据类型有些类似但是不同,而是一种引用类型。
什么是类的实例化呢?
这里用类类型创建对象的过程,称为类的实例化,在java中采用new关键字(在堆中进行创建),配合类名来实例化对象。例如上面定义的洗衣机类,我们来进行实例化。
public class Test {
public static void main(String[] args) {
WashMachine wm1 = new WashMachine();//实例化对象1
wm1.color = "白色";
wm1.size=50;
wm1.wash();
wm1.spinDry();
WashMachine wm2 = new WashMachine();//实例化对象2
wm2.color="灰色";
wm2.size=40;
wm2.wash();
wm2.spinDry();
}
}
class WashMachine{
public int size;//大小
public String color;//颜色
//进行洗的功能
public void wash(){
System.out.println("可以洗衣服");
}
//进行甩干
public void spinDry(){
System.out.println("甩干");
}
}
实例化后运行结果:
注意:
(1)只有通过new关键字才可以实例化对象。
(2)一个类可以创建多个实例对象,这里我只创建了2个。
(3)在这里通过 . 来进行访问对象中的变量和方法。
总结:通过上面的介绍,我明白了,类就相当于建房的图纸,而new出来的对象就相当于一座座建好的新房。由此可得,只有实例化出的对象才能存储数据,并且占用物理空间。
2.类中成员变量的默认初始化
一般我们在方法中使用的变量需要进行初始化,但是在类中的成员变量不需要初始化也不会报错,这是因为编译器内部将这些成员变量自动进行了初始化,对于每一个不同的类型,都有不同的初始化结果,参照下表:
数据类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | '\u0000' |
String | null |
引用数据类型 | null |
通常初始化成员变量是在对象调用构造方法之前进行初始化;意思就是说在实例化一个对象的时候,先初始化实例变量,接着再调用构造方法。
四.this关键字,构造方法和static关键字,详解
1.this关键字
为什么要有这个关键字
(1)当我们在类中定义了一些变量,如果需要给这些变量赋值,在方法中的参数与变量同名时,如果不注意可能会导致出错.
(2) 我们创建一系列对象后,那么类中的方法是如何知道是哪个对象来进行调用的呢。
例如下面的日期类
这里我们使用方法进行赋值后,打印的结果不是我们要的结果,而是0(在类中,int类型初始化为0),因为编译器认为这里的year是参数中的year所以没有给成员变量赋值,但是我们如何进行解决呢,下面是更改后的结果:
这里就解决了第一个疑问。
接下来解决Java是如何判断哪个对象来调用类中的方法呢
(Java识别不同的方法是根据方法中的参数来进行识别的,在方法的重载那里)
这里我们该方法是给date该对象进行初始化,如果我们再创建新的对象,通过方法初始化就和之前的对象没有关系,只会对当前对象进行初始化。
接下来我们来验证查看Java内部是否传递了这个this参数
我们在定义类中的方法和在使用对象调用方法时不需要加入参数,因为Java在处理的时候会自动加上,类中的每一个方法都是相同的,第一个参数都为this。
this关键字的注意事项:
(1)this只能在成员方法中使用,否则会出现错误
(2)this具有final属性,只能引用当前对象,不能引用其他对象
例子:
(3)this的类型:是一种类类型引用,哪个对象调用就是哪个对象的引用类型。
(4)this不能为null。
2.构造方法的使用和定义
上面我们对于日期的设定是通过initDate()方法来进行设置,这样的话,比较麻烦,这里我们就可以使用构造方法来对每个对象来进行设置。
(1)构造方法的概念:
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的声明周期内只调用一次。
例子:
既然我们知道了类中有构造方法,如果没有自己定义构造方法,类中还有构造方法吗,答案是有的,如果自己没有定义构造方法,Java会自动使用默认的构造方法(自己定义后,就不会使用默认的构造方法了),之前我们没有定义构造方法,Java内部会使用下面这个构造方法:
//系统默认的构造方法
public Date(){
}
我们可以通过字节码层面来查看我们上述所说:
关于构造方法使用的注意事项;
(1)名字必须与类名保持一致。
(2)不能有返回值
(3)构造方法可以进行重载(名字相同,参数不同)
(4)构造方法在创建对象时编译器自动调用,在对象的生命周期中只调用一次。
接下来使用代码来验证是否在创建对象时自动调用。
(5)构造方法可以重载,我们还可以在构造方法中调用其他的构造方法,这里使用this关键字来进行调用,需要注意的是我们需要将该语句放到首句,否则会出现错误。
在使用的时候不能两个构造方法相互调用,否则形成一个环,出现错误。
(6)一般使用public来进行修饰。
通过构造方法对成员变量进行初始化,我们还可以直接进行初始化。
3.对象的打印
我们上面学会了关于对象的创建,如果我们打印对象,那么打印的结果是什么呢?
(1)直接打印对象:
(2)重写toString()方法来进行打印
上面水浒传的英雄,我们通过构造方法,已经为每一个对象初始化了,所以我们想打印他们的每一位的具体信息,Java中通过对toString()方法重写可以实现对指定对象信息的打印。
(3)快捷键生成toString()方法
在Idea中可以自动生成该方法。
快捷键 ctrl+insert 或者
鼠标右键选中
选择自己需要的,从而生成toString方法
(4)完整代码
public class Hero {
String name;//姓名
String nickName;//称号
String gender;//性别
public Hero(String name, String nickName, String gender) {
this.name = name;
this.nickName = nickName;
this.gender = gender;
}
public static void main(String[] args) {
Hero hero1 = new Hero("林冲","豹子头","男");
Hero hero2 = new Hero("吴用","智多星","男");
Hero hero3 = new Hero("李逵","黑旋风","男");
System.out.println(hero1);
System.out.println(hero2);
System.out.println(hero3);
}
@Override
public String toString() {
return "Hero{" +
"name='" + name + '\'' +
", nickName='" + nickName + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
4.static关键字
(1)问题的引入
我们对于一个学生类,里面的信息有姓名,性别,年龄和班级,但是对于同一个班的学生来说,那么班级信息就不是每一对象所特有的属性,这时候我们对于每一个学生来说,使用成员变量就不合适了,需要将班级信息让所有学生来共享,这就需要使用static关键字来进行解决
(2)static关键字的概念
在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对
象,是所有对象所共享的,并且static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
(3)如何进行使用
(4)特点
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问。
3. JDK7及以前,HotSpot(Java虚拟机)中存储在方法区,JDK8及之后,类变量存储在Java堆中。
4. 生命周期伴随类的一生,随类只加载一次(即:随类的加载而创建,随类的卸载而销毁)。
(5)static关键字修饰方法
1.Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的
2.如何定义和调用
3.静态方法没有隐藏的this引用参数,因此不能在静态方法中访问任何非静态成员变量,但是可以在非静态方法中使用静态成员变量。
静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用。
静态方法无法进行重写。
(6)static成员变量初始化
注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性。
初始化有两种方法;
1.就地初始化:
就地初始化指的是:在定义时直接给出初始值
2.静态代码块初始化:
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
五. 拓展(代码块)
1.什么是代码块
使用 {} 定义的一段代码称为代码块。但是根据代码块所在的位置以及关键字,又分为四种类型。
(1)普通代码块:定义在方法中的代码块。
例如:
(2)构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
之前我们知道,编译器会将实例变量的结果拷贝给构造方法,既然实例代码块是初始化实例变量的,所以实例代码块会比构造方法先执行,而且实例代码块只有在创建实例对对象时才会执行。
我们可以通过查看class文件来进行验证
(3)静态块: 使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
和实例代码块用法相同,只不过是用来初始化静态成员变量
这里静态代码块和实例代码块不同的是不会给每个构造方法都拷贝一份,只会执行一次,和对象创建的个数无关。
由于静态成员变量是类的属性,所以在jvm加载类的时候给它开辟空间并进行初始化的。
如果定义了多个静态代码块,那么编译器会根据定义的先后顺序来进行执行。
(4)同步代码块
在多线程那里再详细介绍。
六.总结:
总之,需要掌握类和对象的只是,还需要自己按照上面所写的多练,自己琢磨琢磨就会理解。