您的位置:首页 > 教育 > 锐评 > Java类和对象(详解)

Java类和对象(详解)

2025/5/3 14:56:37 来源:https://blog.csdn.net/m0_75235246/article/details/141998689  浏览:    关键词:Java类和对象(详解)

前言:

        Java中类和对象是比较重要的一章,这一章可以让我们深刻认识到Java语言的"精妙之处",它不像C语言那么"细",也不想其他语言封装的那么"保守"。

        游刃有余的解决一系列面向对象问题。

面向对象的理解:

        Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。

面向对象和面向过程:

        什么是面向过程:面向过程大家可以理解为把一件事,或者一个东西拆的很细,比如说一辆汽车,这个汽车就是一个对象,这个过程是什么,就是把汽车拆解,每一个零件的生产拼装,或者是每一个功能是怎么是实现的,都有详细的过程。

        什么是面向对象:刚刚举例的汽车其实就是一个对象,当我们使用汽车的时候,我们只需要知道它有哪些功能,这些功能能做什么,需要的时候就去用,不需要了解其内部是怎么实现这个功能的。人和车就是两个对象,其实整个过程就是人与车两个对象之间的交互。

类的定义和使用:

        面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。

        所以我们需要抽象出一个对象出来,也就是告诉计算机这个洗衣机的长,宽,高,颜色,可以使用的功率等的特征,还需要告诉洗衣机它的作用功能有哪些。

        综上我们在抽象出一个对象的时候,需要描述抽象对象的特征和功能!!

类的定义格式:

 java中定义类时需要用到class关键字,具体语法如下:

 
采用 Java 语言将洗衣机类在计算机中定义完成,经过 javac 编译之后形成 .class 文件,在 JVM 的基础上计算机就可以识别了。
注意事项:
1. 一般一个文件当中只定义一个类
2. main 方法所在的类 一般要使用public修饰 ( 注意: Eclipse 默认会在 public 修饰的类中找 main 方法 )
3. public修饰的类必须要和文件名相同
4. 不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改

类的实例化: 

什么是实例化:

        定义了一个类,就相当于在计算机中定义了一种新的类型,与intdouble类似,只不过intdoublejava语言自 带的内置类型,而类是用户自定义了一个新的类型。它们都是类(一种新定 义的类型)有了这些自定义的类型之后,就可以使用这些类来定义实例(或者称为对象)用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

 类只是一个对象的框架,至于框架里面是是什么还得自己填充。

例如:

public class Test {public static void main(String[] args) {Dog dog = new Dog();dog.color = "yellow";dog.name = "旺财";dog.wag();dog.barks();//dog2Dog dog2 = new Dog();dog2.color = "black";dog2.name = "小黑";dog2.barks();dog2.wag();}
}
注意事项
1、new 关键字用于创建一个对象的实例 .
2、使用 . 来访问对象中的属性和方法 .
3、同一个类可以创建对个实例

类和对象的说明:

1. 类只是 一个 模型 一样的东西,用来对一个实体进行描述,限定了类有哪些成员 .
2. 类是一种自定义的类型 ,可以用来定义变量 .
3. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量

 this引用:

什么是this引用,又为什么会有this引用?

为什么会有this引用:

先看例子:

//写一个类

class Date{public int year;public int month;public int day;public void setDay(int x,int y,int z){year = x;month = y;day = z;}public void print(){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.setDay(2024,9,7);d2.setDay(2024,9,8);d3.setDay(2024,9,9);//打印日期d1.print();d2.print();d3.print();
}

这是一个关于可与日期的类,类中有年月日三个成员变量,还有两个方法(行为),一个是可以可以修改日期的方法,一个是可以打印日期的方法。

 此时注意我将修改日期的方法中的参数改为和成员变量同名的会怎么样!
 

class Date{public int year;public int month;public int day;public void setDay(int year,int month,int day){year = year;month = month;day = day;}public void print(){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.setDay(2024,9,7);d2.setDay(2024,9,8);d3.setDay(2024,9,9);//打印日期d1.print();d2.print();d3.print();
}

结果会是怎样?

 此时那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。

以上的两个疑问问题都会在this这里得到解决!

什么是this引用:

        this引用指向当前对象 ( 成员方法运行时调用该成员方法的对象 ) ,在成员方法中所有成员变量的操作,都是通过该 引用去访问 。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
class Date{public int year;public int month;public int day;public void setDay(int year,int month,int day){this.year = year;//表示该对象的year与参数的year做区分this.month = month;//表示该对象的month与参数的month做区分this.day = day;//表示该对象的day与参数的day做区分}public void print(){System.out.println(year+"."+month+"."+day);}
}

也就相当于this里面存的是调用该成员方法的对象的地址! (this是引用类型,之前讲到过引用类型的特点!)

所以为了避免以上的问题,可以在类里面有关变量的方法里都可以加上this。 

this引用的特征:

1. this 的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this 只能在 " 成员方法"中使用
3. " 成员方法 " 中, this只能引用当前对象,不能再引用其他对象
4. this 成员方法 第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收。

对象的构造和初始化:

如何初始化对象:

通过前面知识点的学习知道,在 Java 方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
public static void main ( String [] args ) {
int a ;
System . out . println ( a );
}
// Error:(26, 28) java: 可能尚未初始化变量 a
要让上述代码通过编译,非常简单,只需在正式使用 a 之前,给 a 设置一个初始值即可。如果是对象:
public static void main ( String [] args ) {
Date d = new Date ();
d . printDate ();
d . setDate ( 2021 , 6 , 9 );
d . printDate ();
}
// 代码可以正常通过编译
需要调用之前写的 SetDate 方法才可以将具体的日期设置到对象中。 通过上述例子发现两个问题:
1. 每次对象创建好后调用 SetDate 方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

构造方法:

        构造方法( 也称为构造器 ) 是一个特殊的成员方法, 名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次
public class Date {
public int year ;
public int month ;
public int day ;
// 构造方法:
// 名字与类名相同,没有返回值类型,设置为 void 也不行
// 一般情况下使用 public 修饰
// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
        public Date(int year, int month, int day){
                this.year = year;                
                this.month = month;
                this.day = day;
                System.out.println("Date(int,int,int)方法被调用了");
}
public void printDate (){
System . out . println ( year + "-" + month + "-" + day );
}
public static void main ( String [] args ) {
// 此处创建了一个 Date 类型的对象,并没有显式调用构造方法
Date d = new Date ( 2021 , 6 , 9 ); // 输出 Date(int,int,int) 方法被调用了
d . printDate (); // 2021-6-9
}
}

注意是每次实例化一个对象的时候就会首先调用构造方法。(不论这个构造方法在哪)

 如果自己没有构造方法,系统会自动调用一个空的构造方法,如果自己写了构造方法,那么就不会再调用系统的构造方法了,只会调用自己写的。

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

 特征:

1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 ( 相当于人的出生,每个人只能出生一次 )
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)。
注意: 一旦用户定义,编译器则不再生成。

构造方法中,可以通过this调用其他构造方法来简化代码:

 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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com