认识Java--类和对象(上)

发布时间:2026/10/14 3:02:03
认识Java--类和对象(上)
前面学习了C语言这门面向过程的编程语言现在学习的Java是门面向对象的语言那么什么叫面向对象的语言呢今天我们从类和对象来介绍引例电磁炉的使用方法很简单插电按下开关选择功率就可以做饭了煤气灶也比较简单拧开阀门打火土灶要先拿一把柴火引火再慢慢添柴然后做饭假如我们做饭的灶台不同那我们是不是就要用不同的方式加热食材来做饭这个时候我们要对每种灶台单独处理这就是面向过程但如果我们细心一点就可以发现所有类型灶台都可以抽象成一个大类—-“灶台””灶台“有两个功能一个是点火另一个是选择火的大小”灶台“还有状态比如火是否已经点燃火苗大小。而”我家的煤气灶““食堂的电磁炉”就是“灶台”这个大类的一个成员我们叫做“对象”。这个时候我们关注的是灶台有什么功能和状态而非这些功能怎么实现这就是面向对象语言一.什么是类面向对象的类我觉得可以理解成类型比如香蕉苹果橘子是水果类河马狮子老虎是动物类等等。类是我们人为抽象出来的是用来描述具体的事物对象的主要包括行为能干什么属性外观尺寸不在意各自的行为和属性具体是什么Java中类用关键字class定义1.类的语法格式下面来看代码示例定义一个food类包含两个属性味道taste和价格price一个行为烹饪Cooking在这里插入代码片classfood{Stringtaste;Stringname;intprice;publicvoidCooking(Stringname){//这个方法不带static修饰后面会解释System.out.println(name做好了);}food是类名{}里面的是类体taste,name和price是类所有对象的属性称之为类的成员属性或类的成员变量Cooking是类所有对象的行为称之为类的的成员方法类的成员变量不是局部变量可以初始化也可以不初始化但局部变量一定要初始化类的成员变量不初始化那么它是有默认值的如下图所示注意事项1:注意一个Java文件中只能有一个类被public修饰这个被public修饰的类的名字要和文件名相同。其余的类的修饰符后续会介绍2:一般一个Java文件中只定义一个类3类名用大驼峰定义二.类的实例化举个例子别人问你中午吃的什么饭你回答了个我吃的饭回答显然太泛化了不够具体如果你说我吃的自己做的牛肉面就比较具体了。在这段话中饭就是一个类它定义了这一类事物的共同属性味道原材料等和行为被加热被吃等自己做的牛肉面是饭这个类的一个对象。也就是说我们单独地说类的属性和行为是没有意义的我们需要找出一个类的一个对象以对象为载体使用属性和行为才有意义这就是类的实例化。更标准的说法是用类创建对象的过程叫做类的实例化。1.语法格式类名 对象名new 类名();这就是类的实例化的语法格式下面看代码示例在这里插入代码片publicclassTest{publicstaticvoidmain(String[]args){food food1newfood();}}2.如何访问对象的属性和行为上面说了使用属性和行为需要先创建对象现在我们已经创建了对象那么调用属性和行为用“对象名.属性”和对象名.行为名“就可以了下面看代码示例在这里插入代码片publicclassTest{publicstaticvoidmain(String[]args){food food1newfood();food1.name牛肉面;food1.price15;food1.taste香辣;System.out.println(food1.name);System.out.println(food1.price);System.out.println(food1.taste);food1.Cooking(food1.name);}}下面是运行结果注意事项一个类可以理解成一件衣服的设计图纸按照这个设计图纸可以做出很多件衣服也就是一个类可以创建很多对象且各个对象之间互不影响3.this关键字以下面的例子为例说明this的作用在这里插入代码片classfood{Stringtaste;Stringname;intprice;publicvoidCooking(Stringname,intprice,Stringtaste){//这个方法不带static修饰后面会解释System.out.println(taste味的name做好了价格是price元);}publicvoidsetName(Stringname){namename;}publicvoidsetPrice(intprice){priceprice;}publicvoidsetTaste(Stringtaste){tastetaste;}}在这里插入代码片publicclassTest1{publicstaticvoidmain(String[]args){food food1newfood();food food2newfood();food1.setName(牛肉面);food1.setPrice(15);food1.setTaste(香辣);food1.Cooking(food1.name,food1.price,food1.taste);food1.setName(麻酱拌面);food1.setPrice(12);food1.setTaste(酸甜);food2.Cooking(food2.name,food2.price,food2.taste);}}下面是运行截图结果居然不是我们想要的这是为什么我们发现Cooking方法打印出的都是成员变量的默认值并不是我们用set方法设置的值也就是说我们的set方法没有发挥作用已food1的setName方法为例方法的参数name是局部变量和成员变量name重名了按照局部变量优先的原则namename这条语句其实是把形参自己的值赋值给了自己并没有赋值给food1的name,因此food1的name还是默认值null同理food1的price,taste,food2的name,price,taste都没有被赋值还是对应的默认值。那么怎么解决这个问题第一种就是把形参的名字给改掉不和成员变量重名就可以了这种方法就不再演示了。我们重点看第二种解决办法—使用this关键字直接上代码在这里插入代码片classfood{Stringtaste;Stringname;intprice;publicvoidCooking(Stringname,intprice,Stringtaste){//这个方法不带static修饰后面会解释System.out.println(taste味的name做好了价格是price元);}publicvoidsetName(Stringname){this.namename;}publicvoidsetPrice(intprice){this.priceprice;}publicvoidsetTaste(Stringtaste){this.tastetaste;}}下面是运行结果这就是this关键字的第一个用法this.成员变量区分局部变量和成员变量。this的第二个用法是this.成员方法();,调用同一个类里面的方法大部分情况下可以省略只有一种情况不能省略这与继承有关我们后面再介绍。第三种的用法就是this(参数)用来调用同一个类里面其他的构造方法要想学习第三用法。我们得先说一下对象的构造(初始化)补充this 是成员方法的第一个隐藏参数从底层实现的角度看this关键字可以理解为每个非静态成员方法的第一个隐藏参数。当你在一个对象上调用方法时例如food1.setName(牛肉面)Java 编译器实际上会把这个对象food1的引用作为第一个参数传递给方法。理解示例假设我们有一个成员方法publicvoidsetName(Stringname){this.namename;}在编译和运行时其内部逻辑可以近似理解为注意这是概念上的解释并非真实语法// 伪代码展示原理publicvoidsetName(foodthis,Stringname){this.namename;}当你调用food1.setName(牛肉面)时实际上相当于setName(food1, 牛肉面)。方法内部的this就指向了传入的food1这个对象。为什么需要这个隐藏参数因为同一个类的多个对象如food1和food2共享同一份成员方法的代码。当food1.setName(...)和food2.setName(...)被调用时方法代码需要知道当前操作的是哪个对象的数据name属性。this这个隐藏参数就提供了这个“当前对象”的引用使得方法能够正确访问和修改调用它的那个对象的成员变量。总结this作为隐藏参数是 Java 实现“对象调用方法时能访问自身数据”这一面向对象特性的关键机制。你之前学到的this.成员变量、this.成员方法()以及this(参数)本质上都是通过这个隐藏的this引用来实现的。三.对象的构造(初始化)对象的构造过程包括分配内存、成员变量默认初始化、执行构造方法等步骤。其中执行构造方法是对象构造过程中的核心环节用来完成对象的显式初始化。因此引入了构造方法那么什么是构造方法作用是什么构造方法是一种特殊的方法它在使用 new 创建对象时自动调用主要作用是用来给对象的属性设置初始值。特点方法法名必须与类名完全相同没有返回值类型连 void 都不能写每个类至少有一个构造方法。如果你不写Java 会提供一个默认的无参构造方法下面看代码示例在这里插入代码片classFood{Stringname;intprice;// 构造方法publicFood(Stringname,intprice){this.namename;this.priceprice;}}在这里插入代码片publicclass{publicstaticvoidmain(String[]args){Foodfood1newFood(牛肉面,15);//这句话调用了构造方法System.out.println(food1.name);System.out.println(food1.price);}}下面是代码执行结果可以看到name和price被成功赋值那如果构造方法重载了我们怎么在其中一个构造方法里面调用别的构造方法使用this关键字来看代码示例在这里插入代码片classFood{Stringname;intprice;// 构造方法publicFood(Stringname,intprice){this(price);this.namename;System.out.println(第一个构造方法被调用了);}publicFood(intprice){this.priceprice;System.out.println(第二个构造方法被调用了)}}publicclassTest1{publicstaticvoidmain(String[]args){Foodfood1newFood(牛肉面,15);System.out.println(food1.name);System.out.println(food1.price);}}我们看到在第一个构造方法中调用了第二个构造方法并成功为price赋值了注意事项1.this(参数)这条语句必须写在构造方法中的第一句2…this(参数)这条语句不可调用它所在的那个构造方法3.不能成环式调用成员变量的·初始化还有就地初始化比较简单这里就不说了