版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章面向对象(上)《Java面向对象程序设计案例教程(第2版)》目录/Contents4.14.24.3面向对象的思想类与对象封装性4.4
构造方法4.54.6this关键字tatic关键字思政要点/Point系统思维
面向对象编程强调整体性和系统性,培养学生的系统思维。抽象能力
通过面向对象的概念,培养学生的抽象思维和建模能力。创新设计鼓励学生进行类的设计和创新,培养创新精神和设计能力。团队合作
面向对象编程需要团队合作,培养学生的团队协作精神和沟通能力。面向对象的思想4.14.1.1程序设计语言的发展面向对象是把问题事物分解成各个对象,把多个功能合理地放到不同对象里,强调的是具备某些功能的对象。通过调用对象的方法来实现程序功能。面向对象的高级程序设计语言这属于第一代程序设计语言,早期的程序设计需要面向机器来编写代码,针对不同的机器编写不同的二进制代码来控制计算机执行操作面向机器的低级程序设计语言面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候依次调用这些函数。面向过程的高级程序设计语言0201程序设计语言034.1.2面向对象程序设计方法封装封装封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。也就是把属性私有化,提供公共方法访问私有对象。继承继承是类之间的一种关系,当多个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其他类继承这个父类。继承后子类自动拥有了父类的属性和方法。多态多态是指一个类实例的相同方法在不同情形下有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。类与对象4.2类是对一组有相同属性和相同功能的对象的概括,一个类所包含的数据和方法能够描述一组对象的共同属性和行为。4.2.1类的定义定义一个类的步骤(1)定义类使用关键字class,然后定义类名。(2)编写类的属性,即声明变量。(3)编写类的方法。4.2.1类的定义类的一般格式如下:class类名{
//定义属性部分(成员变量)
属性1的类型属性1;属性2的类型属性2;…属性m的类型属性m;
//定义方法部分方法1();方法2();…方法n();}说明:(1) class是Java的关键字,表明其后定义的是一个类。(2)类名必须是合法的标识符,一般情况下单词首字母大写。如果类名由多个单词组成,每个单词的首字母均要大写,其余字母小写。类名最好见名知意,如People、HelloWorld等。(3)属性的类型可以是Java的基本数据类型,也可以是数组、字符串或者其他类等引用数据类型。多个同类型的变量,也可以一起声明。(4) class前的修饰符可以有多个,用来限定类的使用方式,在后续章节会详细说明。【例4-1】定义一个狗的类,它有两个属性name和age,以及一个方法bark。publicclassDog{//字段(属性)Stringname;intage;
//方法(行为)voidbark(){System.out.println("汪汪!");}}4.2.1类的定义【例4-2】编写一个名为Car的类,它的属性包括:品牌(make)、型号(model)、年份(year)、颜色(color),同时它具有能够启动和刹车的功能。publicclassCar{//属性Stringmake;//品牌Stringmodel;//型号intyear;//年份Stringcolor;//颜色4.2.1类的定义//方法publicvoidstartEngine(){System.out.println("启动汽车!");}publicvoidstopEngine(){System.out.println("刹车!");}}1.对象的创建对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:(1)声明:声明一个对象,包括对象名称和对象类型。(2)实例化:使用关键字new来创建一个对象,new运算符用于为对象分配存储空间。(3)初始化:使用new创建对象时,会调用构造方法初始化对象。类名对象名;对象名=new类名();创建对象的一般格式:
4.2.2对象的创建与使用类名对象名=new类名();或者,也可以将上述两行代码合写成:
DogmyDogmyDog=newDog();例如:
或者:DogmyDog=newDog();1.对象的创建一个类中可以创建多个对象,对象创建后就拥有了类中所有的成员变量和方法,例如上述例子中Dog类中可以创建多个对象。DogmyDog1=newDog();DogmyDog2=newDog();4.2.2对象的创建与使用2.对象的使用对象的使用原则是先定义后使用。对象在创建之后就拥有了类定义中的所有成员变量,可以使用“ · ”运算符对各个成员进行访问,完成各种操作。引用对象成员的一般格式是:对象名.成员变量;对象名.成员方法();4.2.2对象的创建与使用DogmyDog=newDog();myD=“小黑”; //给name属性赋值“小黑”myDog.age=15; //给age属性赋值15引用对象的成员变量:
myDog.bark();////调用bark()方法调用对象的成员方法:
【例4-3】为例4-1的Dog类创建对象,并对其成员变量和方法进行访问,完成各种操作。publicclassDog{//字段(属性)Stringname;intage;//方法(行为)voidbark(){System.out.println("汪汪!");}publicstaticvoidmain(String[]args){//创建Dog类的对象DogmyDog=newDog();
//使用对象的字段myD="小黑";myDog.age=5;4.2.2对象的创建与使用
//使用对象的字段myD="小黑";myDog.age=5;//调用对象的方法myDog.bark();//输出:汪汪!//访问对象的字段System.out.println("狗的名字是:"+myD);}}程序运行结果:【例4-4】对象的传递publicclassMain{publicstaticvoidmain(String[]args){Dogdog1=newDog();="大黄";Dogdog2=dog1;//dog2引用了dog1指向的对象="小黑";//由于dog1和dog2都引用同一个对象,因此输出将是"小黑"System.out.println("dog1的名字是:"+);}}4.2.3对象的引用传递程序运行结果:在Java中,对象是通过引用来传递的。当你将一个对象赋值给另一个变量时,你实际上是在复制对象的引用,而不是对象本身。这意味着两个变量都指向同一个对象。封装性4.34.3.1封装的意义Java中的封装(Encapsulation)是面向对象编程的一个核心概念,它通过将对象的属性(字段)和方法(行为)结合在一起,并隐藏对象的内部实现细节,仅对外提供有限的访问接口,从而增强代码的安全性、可维护性和灵活性。封装的意义数据隐藏与保护提高代码模块化增强安全性简化接口4.3.2封装的实现在Java中,封装通常通过以下方式实现:1.使用private访问修饰符:将类的属性声明为private,以防止外部类直接访问和修改这些属性。2.提供公共的getter和setter方法:为private属性提供公共的访问和修改方法,这些方法通常被称为getter和setter方法。3.在setter方法中添加验证逻辑:可以在setter方法中添加额外的逻辑来验证输入的值,并在必要时抛出异常或采取其他措施。4.3.2封装的实现创建一个简单的Person类,它包含一些基本的个人信息,如姓名、年龄和电子邮件地址。通过封装,我们将隐藏这些信息的直接访问,并提供公共的getter和setter方法来安全地访问和修改它们。【例4-5】定义类及其成员变量publicclassPerson{//使用private修饰符隐藏成员变量privateStringname;privateintage;privateStringemail;
//无参构造方法publicPerson(){}//有参构造方法,用于初始化对象publicPerson(Stringname,intage,Stringemail){this.setName(name);this.setAge(age);this.setEmail(email);}4.3.2封装的实现【例4-6】提供公共的getter和setter方法publicStringgetName(){returnname;}
//提供公共的setter方法设置属性值,并添加验证逻辑publicvoidsetName(Stringname){if(name!=null&&!name.isEmpty()){=name;}else{System.out.println("姓名不能为空!");="未知";}}
publicintgetAge(){returnage;}//提供公共的setter方法设置年龄,并添加验证逻辑publicvoidsetAge(intage){if(age>0){this.age=age;}else{System.out.println("年龄必须大于0!");this.age=0;//或者设置为一个默认值,比如-1表示无效年龄}}
publicStringgetEmail(){returnemail;}
4.3.2封装的实现【例4-6】提供公共的getter和setter方法//提供公共的setter方法设置电子邮件地址,并添加验证逻辑publicvoidsetEmail(Stringemail){//这里只是一个简单的验证,实际应用中可能需要更复杂的验证逻辑if(email!=null&&email.contains("@")&&email.contains(".")){this.email=email;}else{System.out.println("请输入有效的电子邮件地址!");this.email="unknown@";//或者设置为null或空字符串}}}4.3.2封装的实现【例4-7】测试类publicclassPersonTest{publicstaticvoidmain(String[]args){//创建Person对象并测试封装性Personperson=newPerson();
//设置属性值并测试验证逻辑person.setName("");//输出:姓名不能为空!person.setAge(-5);//输出:年龄必须大于0!person.setEmail("invalid-email");//输出:请输入有效的电子邮件地址!//正确的属性值设置person.setName("张三");person.setAge(30);person.setEmail("zhagnsan@");
//访问属性值并打印System.out.println("姓名:"+person.getName());//输出:姓名:张三System.out.println("年龄:"+person.getAge());//输出:年龄:30System.out.println("电子邮件地址:"+person.getEmail());//输出:电子邮件地址:alice@}}构造方法4.4构造方法是一种特殊的成员方法,其作用是负责对象的初始化工作,为实例变量赋予合适的初始值。定义构造方法的格式是:类名(形参列表){//方法体;}构造方法必须满足以下语法规则:(1)构造方法的方法名必须与类名一样。(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。(3)构造方法不能被static、final、synchronized、abstract和native修饰。(4)构造方法在初始化对象时自动执行,一般不能显式地直接调用。当同一个类存在多个构造方法时,Java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来一一对应,完成构造函数的调用。(5)构造方法的访问修饰符只能使用public或者默认,一般声明为public,如果保持默认则只能在同一个包中创建该类的对象。(6)构造方法分为两种:无参构造方法和有参构造方法。4.4.1构造方法的定义【例4-8】将例4-1的Dog类分别定义无参构造方法和有参构造方法,并为成员变量赋初值。packagecom.test;publicclassDog{//字段(属性)Stringname;intage;//无参构造方法publicDog(){name="小黑";age=5;System.out.println("无参构造方法执行了");}4.4.1构造方法的定义//有参构造方法publicDog(Stringn,inta){name=n;age=a;System.out.println("有参构造方法执行了");}//方法(行为)voidbark(){System.out.println("汪汪!");}voidshow(){System.out.println("dog1的名字是:"+name);System.out.println("dog1的年龄是:"+age);}4.4.1构造方法的定义publicstaticvoidmain(String[]args){//通过无参的构造方法可以创建对象Dogdog1=newDog();dog1.bark();dog1.show();
//通过有参的构造方法也可以创建对象,并给对象中的实例变量赋初值Dogdog2=newDog("大黄",7);dog2.bark();dog2.show();}}4.4.1构造方法的定义程序运行结果如图所示在Java中,构造方法(也称为构造函数)是可以被重载的。这意味着一个类可以有多个构造方法,只要它们的参数列表不同即可。重载的构造方法允许我们在创建对象时以不同的方式初始化对象的状态。【例4-9】重载构造方法的Dog类示例:publicclassDog{//字段(属性)Stringname;intage;Stringbreed;//新增的品种字段
//无参数的默认构造方法publicDog(){name="无名";age=0;breed="未知品种";}4.4.2构造方法的重载//带一个参数的构造方法,仅设置名字publicDog(Stringn){name=n;age=0;//可以选择默认值或抛出异常要求调用者提供breed="未知品种";}
//带两个参数的构造方法,设置名字和年龄publicDog(Stringn,inta){name=n;age=a;breed="未知品种";//或者可以选择其他默认值}
//带三个参数的构造方法,设置名字、年龄和品种publicDog(Stringn,inta,Stringb){name=n;age=a;breed=b;}
4.4.2构造方法的重载//方法(行为)voidbark(){System.out.println("汪汪!");}
//为了方便,可以添加getter和setter方法来访问和修改字段(推荐)publicStringgetName(){returnname;}
publicvoidsetName(Stringname){=name;//这里仍然使用了this,但只是为了展示setter方法的常见实现}
publicintgetAge(){returnage;}
publicvoidsetAge(intage){this.age=age;}
4.4.2构造方法的重载publicStringgetBreed(){returnbreed;}
publicvoidsetBreed(Stringbreed){this.breed=breed;}
publicstaticvoidmain(String[]args){ //使用无参数的默认构造方法Dogdog1=newDog();System.out.println(dog1.getName()+"是"+dog1.getAge()+"岁"+dog1.getBreed());
//使用带一个参数的构造方法Dogdog2=newDog("小黑");System.out.println(dog2.getName()+"是"+dog2.getAge()+"岁"+dog2.getBreed());//使用带两个参数的构造方法Dogdog3=newDog("大黄",5);System.out.println(dog3.getName()+"是"+dog3.getAge()+"岁"+dog3.getBreed());4.4.2构造方法的重载//使用带三个参数的构造方法Dogdog4=newDog("小白",3,"贵宾犬");System.out.println(dog4.getName()+"是"+dog4.getAge()+"岁"+dog4.getBreed());} }程序运行结果如图所示4.4.2构造方法的重载this关键字4.5当类的成员变量(属性)与构造方法或成员方法的参数名相同时,为了区分它们,我们可以使用
this
关键字来引用成员变量。这样做可以避免命名冲突。【例4-10】使用this关键字调用本类中的属性publicclassPerson{Stringname;//成员变量
publicPerson(Stringname){=name;//使用this区分成员变量和参数}}4.5.1使用this关键字调用本类中的属性在上面的例子中,构造方法的参数
name
和类的成员变量
name
同名。通过
=name;,我们将参数
name
的值赋给了成员变量
name。this
关键字也可以用于调用当前类的成员方法。虽然这通常不是必需的(因为你可以直接调用方法名),但在某些情况下,使用
this
可以提高代码的可读性或解决命名冲突。【例4-11】使用this关键字调用成员方法publicclassPerson{voiddisplay(){System.out.println("Displaymethodcalled");}
voidshow(){this.display();//使用this调用本类的成员方法}}4.5.2使用this关键字调用成员方法在上面的例子中,show
方法通过
this.display();
调用了同一类的
display
方法。虽然直接调用
display();
也是可以的,但在某些复杂的上下文中,使用
this
可以使代码更加清晰。在一个构造方法中,可以使用
this
关键字来调用同一个类的另一个构造方法。这是实现构造方法重载时的一种常见做法,可以避免在多个构造方法中编写重复的代码。【例4-12】使用this关键字调用本类的构造方法publicclassPerson{Stringname;intage;
//无参数构造方法publicPerson(){this("Unknown",0);//调用有参数的构造方法}//有参数构造方法publicPerson(Stringname,intage){=name;this.age=age;}}4.5.3使用this关键字调用本类的构造方法在上面的例子中,无参数的构造方法
Person()
通过
this("Unknown",0);
调用了有参数的构造方法
Person(Stringname,intage)。这样,无参数的构造方法就利用了有参数构造方法的代码来初始化对象。4.5.3使用this关键字调用本类的构造方法使用
this
调用构造方法必须是构造方法中的第一条语句。这是因为构造方法的调用必须首先发生,以便正确地初始化对象。如果先执行了其他代码,然后再调用另一个构造方法,可能会导致对象的状态不一致或抛出异常。static关键字4.64.6.1静态变量Java语言中没有全局的概念,但可以通过static关键字来达到全局的效果。Java类提供了两种类型的变量:用static关键字修饰的静态变量和没有static关键字修饰的实例变量。静态变量属于类,只要静态变量所在的类被加载,这个静态类就会被分配空间,因此就可以被使用。对静态变量的引用有两种方式,分别为“类.静态变量”和“对象.静态变量”。【例4-13】静态变量程序实例。publicclassTest{staticStringhobby="Java";publicstaticvoidmain(String[]args){//静态变量可以直接使用类名来访问,无需创建对象System.out.println("通过类名访问hobby:"+Test.hobby);//创建类的对象Testt=newTest();//使用对象名来访问静态变量System.out.println("通过对象名访问hobby:"+t.hobby);//使用对象名的形式修改静态变量的值t.hobby="我爱学Java";//再次使用类名访问静态变量,值已被修改System.out.println("通过类名访问hobby:"+t.hobby); }}程序运行结果如图所示4.6.1静态变量与静态变量一样,我们也可以使用static修饰方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025西南计算机有限责任公司招聘21人笔试考试参考题库及答案解析
- 2025云南昆明市寻甸县卫生健康系统第二批招聘编外人员40人参考考试试题及答案解析
- 2025四川宜宾临港投资建设集团有限公司下属子公司第五批项目制员工招聘3人备考笔试试题及答案解析
- 2025甘肃省新华书店有限责任公司招聘(57人)模拟笔试试题及答案解析
- 深度解析(2026)《GBT 25781-2010 1-萘胺》(2026年)深度解析
- 深度解析(2026)《GBT 25719-2010电液锤 技术条件》(2026年)深度解析
- 2025福建福清市明德幼儿园招聘笔试考试备考题库及答案解析
- 2025年安徽江淮汽车集团股份有限公司公开招聘工作人员1人考试笔试参考题库附答案解析
- 2025北方自动控制技术研究所招聘43人备考考试试题及答案解析
- 《两、三位数除以一位数》数学课件教案
- 项目分包制合同范本
- (2026.01.01施行)《生态环境监测条例》解读与实施指南课件
- 2025年及未来5年市场数据中国废旧轮胎循环利用市场深度分析及投资战略咨询报告
- 《科研伦理与学术规范》期末考试试题及答案2025
- 2025天津大学管理岗位集中招聘15人考试笔试备考题库及答案解析
- Unit 7 When Tomorrow Comes Section A (1a-1d) 课件 2025-2026学年人教版八年级英语上册
- 2025年影像成像原理考试题库
- 2025年智能制造工厂改造项目可行性研究报告及总结分析
- 国电投面试技巧与实战经验交流
- 律师事务所诉讼案件办案进度及当事人满意度绩效评定表
- 2025年公务员多省联考《申论》题(陕西A卷)及参考答案
评论
0/150
提交评论