版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.1类和对象概述面向对象程序设计是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成关联、继承、实现、依赖等关系,从而帮助人们实现对现实世界的抽象与建模。通过面向对象的方法,更利于用人容易理解的方式,对复杂系统进行分析、设计与开发。同时,面向对象也能有效提高编程的效率,通过封装技术和消息机制可以像搭积木一样快速开发出一个全新的系统。4.1.1面向过程与面向对象例如:五子棋游戏的设计面向过程面向对象(1)开始游戏,绘制基本画面。(2)黑棋先走,绘制走完画面。(3)判断黑棋是否赢棋。(4)白棋走棋,绘制走完画面。(5)判断白棋是否赢棋。(6)返回步骤(2),继续执行。(7)输出五子棋输贏结果。五子棋系统系统运作方式(1)棋盘部分:绘制画面及展示双方走棋;(2)黑棋、白棋:除颜色外,行为相同;(3)规则部分:判定输赢和犯规。(1)首先棋盘部分先绘制基本画面。(2)然后黑棋、白棋部分接受用户输入,执行黑棋、白棋部分的行为,并告知棋盘部分。(3)棋盘部分接收黑棋、白棋部分的行为,绘制黑棋、白棋走完后的画面。(4)棋盘部分发生变化后,规则部分对棋局进行判定。4.1.1类和对象的概念姓名蒋某某性别女年龄23职业教师讲课打卡批改作业辅导同学例如讲授Java基础课的蒋老师是一个对象,蒋老师具有的属性包括姓名、性别、年龄、职业等,具有的行为包括讲课、批改作业等。蒋老师开的小轿车也是一个对象,小轿车这个对象具有的属性包括品牌、颜色、价格等,具有的行为包括行驶、停止、喇叭响等。4.1.1类和对象的概念
什么是类?类是对具有相同属性和相同行为的对象的抽象。例如,班级中有学生王云、刘静涛、南天华、雷静,他们4个都是现实世界的学生对象,而学生这个角色是我们大脑中的抽象概念,是对这些类似对象进行的抽象。在计算机世界里,学生就是类。通过学生这个类,可以创建出一个一个的对象,通常也称为实例化出一个一个对象,如下图所示。通过对王云、刘静涛、南天华、雷静这些现实世界学生对象的抽象,可以分析出学生这个类具有的属性包括姓名、年龄、性别、年级等,方法包括听课、写作业等,如下图所示。感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.2Java类JavaAPI提供了一些现有的类,程序员可以使用这些类来创建对象,例如第5单元将要学习的String类。除了使用现有的Java类,程序员还可以自定义Java类,接下来会详细地介绍如何定义和使用Java类。4.2.1Java类的定义在编写第一个Java程序时就己经知道,类是Java程序的基本单元。Java是面向对象的程序设计语言,所有程序都是由类组织起来的。下面是类定义的语法形式。
publicclass类名{ //定义类属性
属性1类型:属性1名;
属性2类型:属性2名; ... //定义方法
方法1定义
方法2定义 ...}4.2.1Java类的定义例如:学生类的定义:publicclassStudent{ StringstuName;//学生姓名 intstuAge;//学生年龄 intstuSex;//学生性别 intstuGrade;//学生年级 //定义听课的方法,在控制台直接输出 publicvoidlearn(){ System.out.println(stuName+"正在认真听课!"); } //定义写作业的方法,输入时间,返回字符串 publicStringdoHomework(inthour){ return"现在是北京时间:"+hour+"点,"+stuName+"正在写作业!"; }}
需要注意的是,这个类里面没有main方法,所以只能编译,不能运行。4.2.2Java类的创建和使用定义好Student类后,就可以根据这个类创建(实例化)对象了。类就相当于一个模板,可以创建多个对象。创建对象的语法形式如下。
类名
对象名=new类名();
创建对象时,要使用new关键字,后面要跟着类名。
根据上面创建对象的语法,创建王云这个学生对象的代码如下。StudentwangYun=newStudent();
这里,只创建了wangYun这个对象,并没有对这个对象的属性赋值,考虑到每个对象的属性值不一样,所以通常在创建对象后给对象的属性赋值。4.2.2Java类的创建和使用
在Java语言中,通过“.”操作符来引用对象的属性和方法,具体的语法形式如下。
对象名.属性;
对象名.方法;
通过上面的语法形式,可以给对象的属性赋值,也可以更改对象属性的值或者调用对象的方法,具体代码如下所示: wangYun.stuName="王云"; wangYun.stuAge=22; wangYun.learn();//调用学生听课的方法4.2.2Java类的创建和使用在编写Java类时我们可以将类文件与主文件分开编写,即编写两个Java文件,当然也可以将两个Java类写在一个Java文件里,但其中只能有一个类用public修饰,并且这个Java文件的名称必须用这个public类的类名命名。publicclassTestStudent{publicstaticvoidmam(String[]args){ //创建对象、调用属性与方法}}classStudent//不能使用public修饰{ //属性与方法的定义}在上面的一些例子中,对对象的属性都是先赋值后再使用,如果没有赋值就直接使用对象的属性,会有什么样的结果呢?4.2.2Java类的创建和使用Student
wangYun=new
Student();
//创建wangYun学生类对象System.out.println("未赋值前的学生姓名为:"+wangYun.stuName);System.out.println("未赋值前的学生年龄为:"+wangYun.stuAge);System.out.println("未赋值前的学生性别数值为:"+wangYun.stuSex);System.out.println("未赋值前的学生年级为:"+wangYun.stuGrade);//给对象的属性赋值wangYun.stuName="王云";wangYun.stuAge=22;wangYun.stuSex=1;//1代表男,2代表女wangYun.stuGrade=4;//4代表大学四年级System.out.println("赋值后的学生姓名为:"+wangYun.stuName);System.out.println("赋值后的学生年龄为:"+wangYun.stuAge);System.out.println("赋斌值后的学生性别数值为:"+wangYun.stuSex);System.out.println("赋值后的学生年级为:"+wangYun.stuGrade);运行结果在未给对象属性赋值前使用属性时,如果该属性为引用数据类型,其初始默认值为null,如果该属性是int型,其初始默认值为0。4.2.4封装封装就是将抽象得到的属性和行为结合起来,形成一个有机的整体,就是类。类里面的一些属性和方法(尤其是属性),需要隐藏起来,不希望直接对外公开,但同时提供供外部访问的方法来访问这些需要隐藏的属性和方法。封装的目的是增强安全性和简化编程,使用者不必了解具体类的内部实现细节,而只是要通过提供给外部访问的方法,来有限制地访问类需要隐藏的属性和方法。感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.3构造方法在前面介绍封装的时候,一旦给学生对象的性别赋值之后就不能修改的这个需求其实并没有实现,因为通过wangYun.setStuSex(1);方法给学生对象wangYun的stuSex属性赋int型"1"这个值,之后仍然可以使用wangYun.setStuSex(2);方法将wangYun的stuSex属性值从"1"改为"2",所以没有实现一旦赋值之后就不能修改的需求。4.3.1构造方法解决问题
因此在这里我们使用构造方法解决该问题。为了实现一旦给学生对象的性别赋值之后就不能修改的功能,所以去掉了setStuSex(intsex)的方法,保证其他对象不能修改学生对象的性别。publicclassStudent{privateStringstuName;privateintstuAge;privateintstuSex;privateintstuGrade;//构造方法,用户初始化对象的成员变量publicStudent(Stringname,intage,intsex,intgrade){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=grade;}//省略了Student类中的其他方法}4.3.2构造方法的使用构造方法(也称为构造函数)是一种特殊的方法,它具有以下特点。●构造方法的方法名必须与类名相同。●构造方法没有返回类型,也不能定义为void,在方法名前不声明返回类型。因为Java设计人员把这种方法名(类名)和返回类型的类名相同的方法看成一个普通方法,只是名称“碰巧”相同罢了,编译器识别时也会认为它是一个方法。为了和普通方法进行区別,Java设计人员规定构造方法不写返回值,编译器通过这一规定识别构造方法,而不是说构造方法真的没有返回值。4.3.2构造方法的使用构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象。一个类可以定义多个构造方法,根据参数的个数、类型或排列顺序来区分不同的构造方法。//构造方法,用户初始化对象的属性(不带年级参数,设置年级默认值为4)publicStudenl(Stringname,intage,intsex){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=4;}//构造方法,用户初始化对象的属性//不带年龄、年级参数,设置年龄默认值为22,年级默认值为4publicStudent(Stringname,intsex){this.stuName=name;this.stuAge=22;this.stuSex=sex;this.stuGrade=4;}//省略了Student类中的其他方法}publicclassStudent{privateStringstuName;privateintstuAge;privateintstuSex;privateintstuGrade;//构造方法,用户初始化对象的属性publicStudent(Stringname,intage,intsex,intgrade){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=grade;}4.3.2构造方法的使用如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造方法,这个构造方法不执行任何代码。如果在定义类时定义了有参的构造方法,没有显式地定义无参的构造方法,那么在使用构造方法创建类对象时,则不能使用默认的无参构造方法。例如,在TestStudent6程序的main方法内添加一行语句:StudentleiJing=newStudent();,编译器会报错,提示没有找到无参的构造方法。感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.4对象初始化过程通过前面的学习,知道类中的成员变量初始化有以下几种情况。●创建对象时默认初始化成员变量。●定义类时,给成员变量赋初值。●调用构造方法时,使用构造方法所带的参数初始化成员变量。在使用new关键字创建并初始化对象的过程中,具体的初始化分为4步。(1)给对象的实例变量分配空间,默认初始化成员变量。(2)成员变量声明时的初始化。(3)初始化块初始化。(4)构造方法初始化。4.4.1初始化块初始化块就是在类中用一对大括号括起来的代码块,语法形式如下:{代码块}
初始化块可以用来初始化类的成员变量。但正如前面所说,使用初始化块初始化成员变量的顺序是在默认初始化成员变量以及成员变量声明时赋值之后,在使用构造方法初始化之前。4.4.1初始化块publicclassStudent{privateStringstuNarae="";privateintstuAge=-1;privateintstuSex=-1;privateintstuGrade=-1;//使用初始化块初始化{System.out.println("使用初始化块初始化");this.stuName="雷静";this.stuAge=22;this.stuSex=2;this.stuGrade=4;}//无参构造方法publicStudent(){System.out.println("使用无参构造函数初始化");}//构造方法,用户初始化对象的成员变量publicStudent(Stringname,intage,intsex,intgrade){System.out.println("使用有参构造函数初始化");this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=grade;}//省略了Student类中的其他方法}publicclassTestStudent7{publicstaticvoidmain(String[]args){Studenttemp=newStudent();System.out.println(temp.getStuName()+"正在读大学"+
temp.getStuGrade()+"年级");//构造方法初始化成员变量在初始化块初始化之后StudentwangYun=newStudent("王云",22,1,4);System.out.println(wangYun.getStuName()+"正在读大学"+
wangYun.getStuGrade()+“
年级");}}运行结果4.4.2对象初始化内存结构代码Studenttemp=newStudent("王云",22,1,4);运行后,内存结构如图所示。(1)给对象的实例变量分配空间,默认初始化成员变量。(2)成员变量声明时的初始化。(3)初始化块初始化。(4)有参构造函数初始化。感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.5.1重载的定义在同一个类中,可以有两个或两个以上的方法具有相同的方法名,但它们的参数列表不同。在这种情况下,该方法就被称为重载(overload)。其中参数列表不同包括以下3种情形:●参数的数量不同。●参数的类型不同。●参数的顺序不同。必须要注意的是,仅返回值不同的方法不叫重载方法。且在编译时会报错4.5.2重载方法的使用在之前介绍一个类可以定义多个构造方法的时候,己经对构造方法进行了重载,接下来通过以下案例学习普通方法的重载。//省略了Student类中的其他方法//传入参数name、age、sex和grade的值,输出结果publicvoidlearn(Stringname,intage,intsex,intgrade){StringsexStr=(sex==l)?"男生":"女生";System.out.println(age+"岁的大学"+grade+"年级"+sexStr+name+"正在认真听课!");}//传入参数name、age和sex的值,grade值取4,输出结果publicvoidlearn(Stringname,intage,intsex){learn(name,age,sex,4);}//传入参数name和sex的值,age的值取22,grade值取4,输出结果publicvoidlearn(Stringname,intsex){leam(name,22,sex,4);}//无参的听课方法,使用成员变量的值作为参数publicvoidlearn(){learn(this.stuName,this.stuAge,this.stuSex,this.stuGrade);}}publicclassStudent{privateStringstuName;privateintstuAge;privateintstuSex;privateintstuGrade;//构造方法,用户初始化对象的属性publicStudent(Stringname,intage,intsex,intgrade){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=grade;}//构造方法,用户初始化对象的属性(不带年级参数,设置年级默认值为4)publicStudent(Stringname,intage,intsex){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=4;}//构造方法,用户初始化对象的属性//不带年龄、年级参数,设置年龄默认值为22,年级默认值为4publicStudent(Stringname,intsex){this.stuName=name;this.stuAge=22;this.stuSex=sex;this.stuGrade=4;}//无参构造方法publicStudent(){}4.5.2重载方法的使用前面的代码重载了learn方法,测试类main方法中的代码如下:Studentstu=newStudent("王云",22,1,4);stu.learn("刘静涛",21,2,3);stu.learn("南天华",20,1);stu.learn("雷静",2);stu.learn();运行结果有些人可能已经注意到了,在一些重载方法的方法体内,调用了其他重载方法。这种情况在类重载方法的使用上非常普遍,有利于代码的重用和维护。感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.6抽象和封装面向对象设计首先要做的就是抽象。根据用户的业务需求抽象出类,并关注这些类的属性和方法,将现实世界中的对象抽象成程序设计中的类。接下来分析一下“租车系统”的部分需求。(1)在控制台输出“请选择要租车的类型:(1代表轿车,2代表卡车)”,等待用户输入。(2)如果用户选择的是轿车,则在控制台输出“请选择轿车品牌:(1代表红旗,2代表长城)”,等待用户输入。(3)如果用户选择的是卡车,则在控制台输出“请选择卡车吨位:(1代表5吨,2代表10吨)”,等待用户输入。(4)在控制台输出“请给所租的车起名:”,等待用户输入车名。(5)所租的车油量默认值为20升,车辆损耗度为0(表示刚保养完的车,无损耗)。(6)具有显示所租车辆信息功能,显示的信息包括:车名、品牌/吨位、油量和车损度。4.6.1类抽象首先要进行类抽象,就是发现类并定义类的属性和方法。(1)发现名词;(2)确定类和属性;(3)确定方法。轿车类图卡车类图4.6.2类封装类抽象的目的在于抽象出类,并确定属性和方法,而接下来的类封装,则要在封装的角度隐藏类的属性,提供公有的方法来访问这些属性。最简单的操作方法就是,把所有的属性都设置为私有属性(表示私有属性和方法时,需在类图中的属性和方法前加上“-”号),每个私有属性都提供getter和setter公有的方法(表示公有属性和方法时,需在类图中的属性和方法前加上“+”号),最终可得到封装后的类图:
轿车类图卡车类图4.6.2类封装这样的封装过于简单,没有考虑需求,接下来进一步阅读需求,可以发现以下几点。
(1)租车时可以指定车的类型和品牌(或吨位),之后不允许修改。(2)油量和车损度租车时取默认值,只有通过车的加油和行驶的行为改变其油量和车损度值,不允许直接修改。根据需求,应对轿车类和卡车类做如下修改:(1)去掉所有的setter方法,保留所有的getter方法。(2)提供addOil()、drive()这两个公有的方法,实现车的加油和行驶的行为。(3)至少需要提供一个构造方法,实现对类型和品牌(或吨位)的初始化。4.6.3方法的实现在Car类和Truck类的代码中,addOil()方法和drive()方法的功能还没有实现,接下来结合需求,分别完成Car类和Truck类中的这两个方法。《租车系统》增加了如下需求:(1)不论是轿车还是卡车,油箱最多可以装60升汽油,每次给车加油,增加油量20升。如果加油20升超过油箱容量时,则加到60升即可,并在控制台输出“油箱己加满!”。(2)汽车行驶1次,耗油5升,车损度增加10,如果油量低于10升,则不允许行驶,直接在控制台输出“油量不足10升,需要加油!”。importjava.util.Scanner;importorg.unitthree.*;classTestZuChe2{publicstaticvoidmain(String[]args){Carcar=newCar("战神","长城");//初始化轿车对象carcar.show(); //输出车辆信息car.drive(); //让car行驶1次,油量剩下15升,车损度为10car.show(); //输出车辆信息car.drive(); //让car再行驶1次,油量剩下10升,车损度为20car.drive(); //让car再行驶1次,油量剩下5升,车损度为30car.drive(); //让car再行驶1次,因油量不足10升,不行驶,提示需要加油car.addOil(); //让car加油1次,油量增加20升,达到25升car.show(); //输出车辆信息}}//加油publicvoidaddOil(){if(oil>40) //如果加油20升则超过油箱容量,则加到60升即可{oil=60;System.out.println("邮箱已加满!");}else{ //加油20升oil=oil+20;}System.out.println("加油完成!");}//行驶publicvoiddrive(){if(oil<10){System.out.println("油量不足10升,需要加油!");}else{System.out.println("正在行驶!");oil=oil-5;loss=loss+10;}}示例代码:测试类中运行结果:4.6.3方法的实现感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.7.1继承的概念在前面的课程中,根据《租车系统》的需求抽象出了Car类和Truck类,在这两个类中有许多相同的属性和方法,例如name、oil、loss属性以及相应的getter方法,还有addOil()和drive()方法。这样做有两个问题,一是代码大量重复,二是如果要修改,两个类都要修改,会很麻烦,而且容易忘记修改部分内容。Java继承是使用己存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的属性或新的方法,也可以用已存在的类的属性和方法。这种技术能够非常容易地复用以前的代码,大大缩短开发周期,降低开发费用。4.7.1继承的概念继承的语法形式如下:classAextendsB{类定义部分}即A类继承B类,B类称为父类、超类或基类,A类称为子类、衍生类或导出类。4.7.2继承的使用了解Java继承的概念后,接下来使用继承来解决Car类和Truck类重复代码的问题。作为程序设计人员,可以将Car类和Truck类重复的代码挑出来,提取到一个单独的Vehicle类中,然后让Car类和Truck类继承Vehicle类,这样可以在保留Vehicle类的属性和方法的同时,增加不同的属性和方法。可得继承的类图:根据图可编写Vehicle类,Car类和Truck类。4.7.3继承的访问权限继承最大的好处是,子类可以从父类中继承属性和方法,那么子类是不是能继承父类所有的属性和方法呢?具体情况说明如下。●
子类可以继承父类中访问权限修饰符为public和protected的属性和方法。●
子类可以继承父类中用默认访问权限修饰的属性和方法,但子类和父类必须在同一个包中。●
子类无法继承父类中访问权限修饰符为private的属性和方法。●
子类无法继承父类的构造方法。4.7.4方法的重写子类可以从父类继承相应访问权限的方法,但如果父类的方法不能满足子类的需要,则可以在子类中对父类的同名方法进行覆盖,这就是重写。假设《租车系统》中,系统的需求发生了如下变化:卡车每行驶1次,耗油从5升提升为10升,增加车损度10,如果油量低于15升,则不允许行驶,直接在控制台输出“油量不足15升,需要加油!”在此情况下可以通过重写解决。4.7.4方法的重写在Truck类中添加如下的代码,重写父类的drive()方法。//子类重写父类的drive()方法publicvoiddrive(){if(oil<15){System.out.println("油量不足15升,需要加油!");}else{System.out.println("正在行驶!");oil=oil-10;loss=loss+10;}}4.7.4方法的重写重写需要满足的条件●重写方法与被重写方法同名,参数列表也必须相同。●重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类。●重写方法不能缩小被重写方法的访问权限。4.7.5属性的覆盖创建父类对象,实现的时候用子类实现,此时这个对象的属性为父类的属性,不被子类覆盖。父类的方法被子类覆盖,调用了子类重写的方法,显示出“子类方法”。publicclassSubextendsSuper{publicinti=100; //子类同名属性i,赋值100publicstaticvoidmain(String[]args){Supersup=newSub(); //创建父类对象,用子类实现System.out.println(sup.i);//输出sup的i属性}}classSuper{publicinti=50; //父类属性i,赋值50}publicclassSubextendsSuper{publicinti=100;publicvoidshow() //子类方法重写,显示“子类方法”{System.out.println("子类方法");}publicstaticvoidmain(String[]args){Supersup=newSub(); //创建父类对象,用子类实现sup.show(); //调用的是子类方法,覆盖了父类方法System.out.println(sup.i);}}classSuper{publicinti=50;publicvoidshow() //父类方法,显示“父类方法”{System.out.println("父类方法");}}4.7.6继承中的初始化在第一次实例化子类时,先调用父类的静态块,再调用子类的静态块,之后再调用父类的非静态块和构造方法,再调用子类的非静态块和构造方法。注意,当第二次实例化子类时,父类和子类的静态块都不会再被调用,因为它们是静态块,属于类级别的,只会被调用一次。publicclassInitDemo{publicstaticvoidmain(String[]args){System.out.println("第一次实例化子类:");newSub();System.out.println("第二次实例化子类:");newSub();}}classSuper{static{System.out.println("显示:父类中的静态块!");}{System.out.println("显示:父类中的非静态块!");}Super(){System.out.println("显示:父类构造方法!");}}classSubextendsSuper{static{System.out.println("显示:子类中的静态块!");}{System.out.println("显示:子类中的非静态块!");}Sub(){System.out.println("显示:子类构造方法!");}}感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.8.1向上转型把对某个对象的引用看作其父类对象的引用的做法称为向上转型。即父类对象的引用指向子类对象。父类Vehicle子类Car//驾驶员获取车辆信息,输入参数为车对象publicvoidcallShow(Vehiclev){v.show();}向上转型的应用当需要获取车辆信息时,无论传入的参数是轿车对象或者卡车对象,在这里都会将其转换为其父类Vehicle对象。并且调用的show()方法都是对应子类重写的show()方法。4.8.1向上转型向上转型虽然可以减少代码量增加程序的可扩展性,但需要注意以下几点:1、可以直接访问子类重写方法;
2、不能直接访问子类私有方法、子类所有属性;
3、可以通过重写方法调用子类私有方法和属性;
4、重写方法中调用方法和属性顺序:子类->父类。4.8.2向下转型向下转型则与向上转型相反,子类引用指向父类对象。也就是说可能明明需要一个Car类引用,却提供了一个Vehicle类的对象。显然,这样的做法是不安全的。并且不是所有的对象都可以向下转型,只有这个对象原本是子类对象通过向上转型得到的时候才能成功的向下转型。因此在对对象的强制类型转换时,不知道会不会抛出异常,因此可通过instanceof运算符(不是方法),可以进行类型判断,避免抛出异常。importorg.unitthree.*;classTestZuChe7{publicstaticvoidmain(String[]args){//Vehiclev=newCar("战神","长城"); //声明父类对象,实例化出子类对象Vehiclev=newTruck("大力士二代","10吨");v.show();if(vinstanceofCar) //对象v属于Car类型{Carcar=(Car)v; //将对象v强制类型转换成Car类对象System.out.println(car.getBrand());//调用Car类的特有方法getBrand()}else{ //对象v不属于Car类型Trucktruck=(Truck)v; //将对象v强制类型较换成Truck类对象System.out.println(truck.getLoad()); //调用Truck类的特有方法getLoad()}}}抛出异常实例代码感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.9.1Java包程序员可以使用package关键字指明源文件中的类属于哪个具体的包,包的语法形式如下:packagepkg1[.pkg2[.pkg3...]];程序中如果有package语句,该语句一定是源文件中的第一条可执行语句,它的前面只能有注释或空行。另外,一个文件中最多只能有一条package语句。packageone.two.test; //声明包publicclassTestPackage{publicstaticvoidmain(String[]args){System.out.println("packagecom.bd.test");}}示例代码包结构4.9.1Java包JDK的类库被分成许多包,这些包是分层次组织的,就像在硬盘上嵌套有各级子目录一样。最高一级的包名是
java
和
javax
,其下一级的包名有lang、util、net、io等,如下图所示:JDK包结构4.9.1Java包下面简要介绍JDK类库中不同包的主要功能:●java.lang:提供利用Java编程语言进行程序开发的基础类,例如String、Math、Integer、System和Thread等。●java.util:Java工具类,包含对集合的操作、事件模型、日期和时间设置、国际化和各种实用工具类。●java.io:通过数据流、序列化和文件系统提供系统输入和输出。●:为实现网络应用程序而提供的类。●java.awt:包含用于创建用户界面和绘制图形图像的类。4.9.2引用包当使用的类不在当前目录下时,不能对类进行引用,常见解决办法如下:●完整类名引用类:使用完整类名com.bd.test.TestPackagetp=newcom.bd.test.TestPackage();●导入包:import包名.类名;//这里的包名可以是自定义或公共的importcom.bd.test.*; //导入com.bd.test中所有的公共类classTestImport5{publicstaticvoidmain(String[]args){TestPackagetp=newTestPackage(); //直接使用导入的类tp.show();}
}4.9.3访问权限Java语言中的访问权限修饰符有4种,但却只有3个关键字。因为不写访问权限修饰符时,在Java中被称为默认权限(包权限),本教材中以default代替。其他3个访问权限修饰符分别为private、protected和public。修饰符类内部同一个包中子类任何地方privateYes
defaultYesYes
protectedYesYesYes
publicYesYesYesYes访问权限修饰符总结4.9.4static包声明为static的变量称为静态变量或类变量。声明为static的方法称为静态方法或类方法。
可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。
静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。4.9.4static包
静态块的语法形式如下:static{
语句块}Java类首次装入Java虚拟机时,会对静态变量(含静态块)或方法进行一次初始化,方法不被调用是不会执行的,就是说静态变量和静态块是在类首次装载进Java虚拟机时被执行的。感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.10抽象类在面向对象的世界里,所有的对象都是通过类来实例化的,但并不是所有的类都是直接用来实例化对象的。如果一个类中没有包含足够的信息来描绘一个具体的事务,这样的类可以形成抽象类。抽象类往往用来表示在对事务进行分析、设计后得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。4.10.1抽象类的概念Java中提供了一种专门供子类来继承的类,这个类就是抽象类,其语法形式如下:abstractclass类名{}Java也提供了一种特殊的方法,这个方法不是一个完整的方法,只含有方法的声明,没有方法体,这样的方法叫做抽象方法,其语法形式如下:其他修饰符
abstract返回值
方法名();4.10.2抽象类的使用现有Person类、Chinese类和American类三个类,其中Person类为抽象类,含有eat()和work()两个抽象方法,其类关系如图所示。抽象类之间的类图关系4.10.3抽象类的特征抽象类为什么不能被直接实例化?1.从Java规范:Java程序中规定了抽象类不能实例化。强行实例化就会报错。2.从功能角度:抽象类是一个结构和功能“不完整”的类,如果你让他强行“出生”的话,它可能会患有各种疾病,所以我们不能直接进行实例化,需要通过子类对结构和功能进行补全才能让它健康出生。3.从内存分配角度:抽象类只在分配了在栈中的引用,没有分配堆中的内存。程序都有一个代码段,在内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化。感谢观看,下次再见类与对象应用单元四类和对象概述Java类构造方法目录CONTENTS123对象初始化过程重载45继承多态
78抽象和封装
6抽象类接口
1011包和访问控制
9目录CONTENTS4.11.1接口的概念如果抽象类中的方法都是抽象方法,那么由这些抽象方法组成的特殊的抽象类就是接口。抽象类更侧重于对相似的类进行抽象,形成抽象的父类以供子类继承使用,而接口往往在程序设计的时候,定义模块与模块之间应满足的规约,使各模块之间能协调工作。Java接口定义的语法形式如下:[修饰符]interface接口名[extends][接口列表]{接口体}类实现接口的语法形式如下:[类修饰符]class类名implements接口列表{类体}4.11.2接口的使用(1)定义电子邮件接口。publicinterfaceEmailInterface{//设置发信者邮箱publicvoidsetSendAdd(Stringadd);//设置收信者邮箱publicvoidsetReceiveAdd(Stringadd);//设置邮件主题publicvoidsetEmailTitle(Stringtitle);//设置邮件内容publicvoidwriteEmail(Stri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年合同保密与信息安全3篇
- 2024年桃吕婚姻结束及后事处理协议书
- 2024版个人信用卡透支借款合同范本汇编3篇
- 2024年新型债务化解与资产重组专项协议3篇
- 建筑木材购销合同
- 12 我的环保小搭档 教学实录-2023-2024学年道德与法治二年级下册统编版
- 2024版反担保动产质押互联网金融服务合同3篇
- 2024年某影视公司与演员关于电视剧拍摄的肖像权合同
- 2024至2030年中国感应式IC卡餐饮机行业投资前景及策略咨询研究报告
- 2024版德佑房屋租赁合同租赁双方争议解决机制3篇
- 2014年吉林省长春市中考模拟数学
- 上汽-最详细的整车开发流程(CPMP)
- 论文岩棉用酚醛树脂体系
- 设计开发记录总表
- 通风填写范例
- 盲人无障碍出行调查问卷分析报告(20220215150515)
- 财务审批权限管理办法
- 许昌特产介绍
- 欧姆龙AD081、DA08C输入输出模块的使用手册
- 外墙真石漆施工合同书
- 一千个伤心的理由(张学友)原版五线谱钢琴谱正谱乐谱.docx
评论
0/150
提交评论