🎀作者:爱塔居的博客_CSDN博客-领域博主
🌭专栏:JavaSE
🍧作者简介:大三学生,想要努力地变得更好!
附上一张可可爱爱的猫猫图~
🍓🍓🍓🍓🍓🍓
文章目录
目录
文章目录
前言
一、面对对象的初步认知
面向对象和面向过程
二、 类定义和使用
2.1 简单认识类
2.2 类的定义格式
三、类的实例化
3.1 什么是实例化
编辑
3.2 类和对象的说明
3.3 引用与对象
四、this引用
4.1 为什么要有this引用
4.2 什么是this引用
4.3 this引用的特性
五、对象的构造及初始化
5.1 构造方法
5.1.1 概念
5.1.2 特性
5.2 默认初始化
5.3 就地初始化
前言
Java是一门纯面向对象的语言。面向对象也叫OOP。Java当中一切皆对象。类和对象的知识需要慢慢地理解~可能需要多花些时间。
一、面对对象的初步认知
面向对象和面向过程
🎉面对对象:解决问题的一种思想,主要是依靠对象之间的交互完成一件事情。
举个🌰:
面对过程:关注过程
小陈想喝鸭汤。她需要买小鸭子,把小鸭子养大,杀鸭子,把鸭子砍成块,洗干净鸭肉放锅,切生姜放锅,倒料酒,水煮沸让鸭肉去腥,倒掉水,开始放各种配料调料开始炖汤,等汤炖好了,关火,等喝汤。
喝个鸭汤,差点把小陈累瘫了。按这种方式写代码,将来扩展或者维护起来会比较麻烦。
面对对象:关注对象
小陈想喝鸭汤。她走进了一家饭店:“老板,来一碗鸭汤。”喝完,付完钱,走人。
总共三个对象:小陈 饭店老板 鸭汤
小陈喝鸭汤,是通过对象之间的交互完成的。
🌺🌺
【注意】:面对过程和面对对象并不是一门语言,而是解决问题的方法,没有好坏之分,都有其专用的应用场景。
二、 类定义和使用
面对对象程序设计关注的是对象,而对象是现实生活中的实体。
要拿到对象,必须先有类。
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似。只不过,int和double是java语言自带的内置类型,而类是用户自定义了一个新的类型。
2.1 简单认识类
类是用来对一个实体(对象)进行描述的,主要描述该实体(对象)具有哪些属性,哪些功能行为的。描述完成后,计算机就可以识别了。
比如:洗衣机,我们在java中把它看成一个类别
属性:产品品牌、型号、产品重量、外观尺寸、颜色……
功能:洗衣、烘干……
2.2 类的定义格式
在java中定义类时,需要用到class关键字,具体语法
class 类名{
属性(或者叫成员属性、成员变量)
行为(或者叫成员方法)
}
举例如下
class WashMachine{
public String brand;//属性
public String type;
public double weight;
public double length;
public double width;
public double height;
public String color;
//功能
public void washClothes(){
System.out.println("洗衣服");
}
public void dryClothes(){
System.out.println("脱水");
}
}
public class Test {
public static void main(String[] args) {
}
}
🥑🥑 其中class为定义类的关键字,WashMachine为类的名字,{}中为类的主体。
🧃🧃🧃注意事项:
1.类目注意采用大驼峰定义
2.成员前写法统一为public
3.此处写的方法不带static关键字
4.一般一个文件当中只定义一个类,一个文件只能有一个public类
5.main方法所在的类一般使用public修饰(注意:Ecipse默认会在public修饰的类中找main方法)
6.public修饰的类名必须要和文件名相同
🍵🍵不要轻易修改public修饰的类的名称,如果要修改:
注意我用到是Idea
然后找到Refactor选项, 点击后找到Rename选项,点击后会出现这样的页面:
三、类的实例化
3.1 什么是实例化
🍍🍍🍍
用类类型创建对象的过程,称为类的实例化。在Java中采用new关键字,配合类名来实例化对象。
举个例子:
class Student{
public String name;
public int age;
public void doHomeWork(){
System.out.println("写作业");
}
public void playGames(){
System.out.println("打游戏");
}
}
public class Test {
public static void main(String[] args) {
Student student=new Student();//new一个对象
student.name="小陈";
student.age=18;
System.out.println(student.name+" "+student.age);
student.doHomeWork();
}
}
输出结果如下:
🍰🍰🍰注意事项:
1.new关键字用于创建一个对象的实例
2.使用.来访问对象中的属性和方法
3.同一个类可以创建多个实例
🍅🍅🍅🍅第三点,我们可以在原本的学生类代码上做些修改:
class Student{
public String name;
public int age;
public void doHomeWork(){
System.out.println("写作业");
}
public void playGames(){
System.out.println("打游戏");
}
}
public class Test {
public static void main(String[] args) {
Student student1=new Student();//new一个对象
student1.name="小陈";
student1.age=18;
System.out.println(student1.name+" "+student1.age);
Student student2=new Student();
student2.name="小俊";
student2.age=18;
System.out.println(student2.name+" "+student2.age);
}
}
现在我们创建了两个实例,小陈和小俊。现在我们看一下结果:
补充:如果name和age没有赋值,也不会报错。因为他们属于成员变量,编译器会给他们默认值,如果是引用类型,默认为null;int float对应的0值,bollean默认值false char -> '\u0000'
3.2 类和对象的说明
🍓1.类是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员
🍉2.类是一个自定义的类型,可以用来定义变量
🍈3.一个类可以实例化出多个对象。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图。实例化出的对象才能占用实际的物理空间,存储类成员变量。
3.3 引用与对象
1.当一个引用赋值为null的时候,代表:这个引用不指向任何对象。
class Student{
public String name;
public int age;
}
public class Test {
public static void main(String[] args) {
Student student1=new Student();//new一个对象
student1.name=null;
student1.age=18;
System.out.println(student1.name+" "+student1.age);
}
}
输出:
2.引用不能指向引用
下面这个例子并不是引用指向引用:
class Student{
public String name;
public int age;
}
public class Test {
public static void main(String[] args) {
Student student1=new Student();//new一个对象
student1.name="小陈";
student1.age=18;
Student student2=new Student();
student2.name="小俊";
student2.age=19;
student1=student2;
System.out.println(student1.name+" "+student1.age);
}
}
输出结果:
🍎这个例子代表的是 student1这个引用指向了student2这个引用指向的对象
3.一个引用不能同时指向多个对象
举例子:
class Student{
public int age;
}
public class Test {
public static void main(String[] args) {
Student student1=new Student();
//new一个对象
student1.age=1;
student1=new Student();
student1.age=2;
student1=new Student();
student1.age=3;
student1=new Student();
student1.age=4;
System.out.println(student1.age);
}
}
输出结果:
最后,student1只是指向了一个对象。所以,可以换对象,不能有多个对象。
四、this引用
4.1 为什么要有this引用
class Student{
public String name;
public int age;
public void information(String x,int y){
name=x;
age=y;
}
public void show(){
System.out.println("姓名"+name+" 年龄"+age);
}
}
public class Test {
public static void main(String[] args) {
Student student1=new Student();
//new一个对象
student1.information("小陈",18);
student1.show();
Student student2=new Student();
student2.information("小俊",19);
student2.show();
}
}
以上代码定义了一个学生信息类,main方法中创建了三个对象,并通过类中的成员方法对对对象进行设置和打印。
🍑🍑看似没有问题,就有一点困惑。
两个对象都在调用information和show函数,但是两个函数中没有任何关于对象的说明,information和show函数如何知道打印的是那个对象的数据呢?
我们在20行的地方取断点,Debug调试:
其实代码中隐藏了点东西!
方法前面是哪个引用,就调用哪个对象的方法。this代表的是当前对象的引用。
this还有另外两种用法:
this访问构造方法
this访问成员方法
🍇🍇🍇🍇🍇🍇
这里加不加this,都没有影响。但是!我们要习惯使用this!!!
4.2 什么是this引用
4.3 this引用的特性
1,this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2.this只能在“成员方法”中使用
3.在“成员方法”中,this只能引用当前对象,不能再引用其他对象
4.this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责接收
五、对象的构造及初始化
5.1 构造方法
5.1.1 概念
构造方法(也称为构造器)是一个特殊的成员方法,这个方法没有返回值,方法名和类名时一样的,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
public Student(){ }
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;
}
public void printDate(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
Date d=new Date(2021,6,9);
d.printDate();
}
}
注意:
1.局部变量和成员变量的区分:
局部变量在方法内。成员变量在类内,在方法外。
2.构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
5.1.2 特性
1.名字必须与类名相同
2.没有返回值,设置为void也不行
3.创建对象时,由编译器自动调用,并且在对象的生命周期内只调用一次
4.构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public class Date {
public int year;
public int month;
public int day;
//无参构造方法
public Date(){
this.year=1900;
this.month=1;
this.day=1;
}
//带有三个参数的构造方法
public Date(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
}
public void printDate(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
Date d=new Date();
d.printDate();
}
}
输出结果:
5.如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。但是用户一旦定义,编译器则不再生成。
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;
}
public void printDate(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
Date d=new Date();
d.printDate();
}
}
结果:
伸个懒腰 ~
6.构造方法中,可以通过this调用其他构造方法来简化代码
public class Date {
public int year;
public int month;
public int day;
// 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
// 但是this(1900,1,1);必须是构造方法中第一条语句
public Date(){
//System.out.println(year); 注释取消掉,编译会失败
this(1900, 1, 1);
//this.year = 1900;
//this.month = 1;
//this.day = 1;
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
🍧🍧注意:
this(...)必须是构造方法中第一条语句
public class Date {
public int year;
public int month;
public int day;
public Date(){
System.out.println("year:"+year+" month:"+month+" day:"+day);
this(1900, 1, 1);
}
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public static void main(String[] args) {
Date date=new Date();
}
}
编译结果:
不能形成环
public class Date {
public int year;
public int month;
public int day;
public Date(){
this(1900, 1, 1);
System.out.println("year:"+year+" month:"+month+" day:"+day);
}
public Date(int year, int month, int day) {
this();
}
public static void main(String[] args) {
Date date=new Date();
}
}
编译结果:
会循环调用,编译报错。
7.绝大多数情况下使用public来修饰,特殊场景下会被private修饰。
5.1.3 写构造方法的简便方法
第一步:
或者是直接使用快捷键Alt+insert
第二步:
选择第一个选项:Constructor,出现这样的页面:
第三步:
选择要哪些参数:
如果没有选择参数,就会生成以下的无参构造方法:
public Student() { }
如果要选择一个参数,直接点击选项,点击OK,就能生成:
public Student(int age) { this.age = age; }
如果要多个参数。按着Ctrl键,点击选项,生成:
public Student(String name, int age) { this.name = name; this.age = age; }
5.2 默认初始化
Date d=new Date(2021,6,9);
在程序层面只是简单的一条语句,在JVM层面需要做好多事情:
public class Date {
public int year;
public int month;
public int day;
public Date(){
System.out.println("year:"+year+" month:"+month+" day:"+day);
}
public static void main(String[] args) {
Date date=new Date();
}
}
5.设置对象头信息
6.调用构造方法,给对象中各个成员赋值
5.3 就地初始化
public class Date {
public int year=2022;
public int month=11;
public int day=11;
public Date(){
System.out.println("year:"+year+" month:"+month+" day:"+day);
}
public static void main(String[] args) {
Date date=new Date();
}
}
🌳🌳🌳
注意点:
1.不能这样初始化:
public int year;
year=2022;
2.代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。