《类和对象下》PPT课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重载不考虑方法的返回值类型。
方法重载的作用域规则
只有属于同一作用域范围内的方法才能构成重载。
class First {
…… public void show() {
…… } …… }
class Second {
…… public void show(int x) {
…… }
不构成重…载…
}
课堂练习1
/*求绝对值的方法*/ public int abs(int x) {
return百度文库((x >= 0) ? x : -x); }
方法的定义
/*main方法,程序入口*/
方法的调用
public static void main(String[] args)
{
//必须先实例化类的对象,才可以调用到其中的成员方法
方法重载
本章目标
重载构造方法
对象在内存中的存放形式
this关键字
回顾函数
在Java中,函数无需C语言中的前向声明,只要直接定义即可;
Java中,函数被称为方法;
定义一个方法的一般形式:
[访问权限] 返回值类型 方法名称(形参列表) { 方法主体;
方法原型
}
我们更关注的是方法原型,对于方法原型的三个主要组成部分应当明 确区分:
类型的数据。
方法重载的两种方式之二
利用不同数量的参数重载,如:
/*函数定义*/ int fun(int n1) {……} int fun(int n1, int n2, int n3) {……} /*函数调用*/ 将f调un用(a与);参数最匹配的方法,如果没有方法得出最佳匹配,那么编译器将报错; fun编(x译,器y解, 决z)重;载的方式与方法定义的顺序无关;
/*abs方法的重载*/ int abs(int x) {……} float abs(float x) {……} double abs(double x) {……} long abs(long x) {……}
方法重载的三大原则
方法名相同 参数不同(可以有三方面的不同)
数量不同 类型不同 顺序不同
但有时候,我们可能还需要求浮点数的绝对值,请问:可以继续使用这个方 法吗
事实上是行不通的,这个方法只能求出整数的绝对值,对于浮点数,还需另外再 定义求浮点数绝对值的方法。
修改案例
public class AbsoluteValue { /*求整数绝对值的方法*/ public int absOfInt(int x) { return ((x >= 0) ? x : -x); } /*求浮点数绝对值的方法*/ public float absOfFloat(float x) { return ((x >= 0) ? x : -x); }
AbsoluteValue obj = new AbsoluteValue();
int a = -8, b;
b = obj.abs(a); //调用abs方法求a的绝对值
System.out.println(a + "的绝对值是" + b);
}
}
案例分析
在上面的案例中,我们已经定义了求整数绝对值的方法
返回值类型
方法名称
形式参数
在Java中定义方法
/*Java中的方法示例 代码片段*/ 返回值类型 方法名称
/*定义求平方值的方法*/ public int square(int x) {
return (x * x); }
形式参数
案例
/*编写求绝对值的方法来求整数的绝对值*/ /*AbsoluteValue类,其中包含求绝对值的方法 Java中的任何方法都必须在类中定义*/ public class AbsoluteValue {
//重载方式1,求整数的绝对值 //重载方式2,求浮点数的绝对值 //重载方式3,求双精度数的绝对值 //重载方式4,求长整型数的绝对值
public static void main(String[] args) { AbsoluteValue obj = new AbsoluteValue(); int a = -8, b; b = obj.abs(a); System.out.println(a + "的绝对值是" + b);
成员变量1 成员变量2
…… 成员变量n
this关键字
既然所有的对象都共用相同的成员方法,那么在不同的对象都调用同一方法时, 它是怎么确定要使用哪个对象的数据成员呢?
成员方法被对象调用时都会传递一个隐含的this引用参数,它总是指向调用该 方法的对象;
关键字this给出调用成员方法的对象地址; 每当对象调用成员方法时,编译器会向this分配调用该方法的对象地址; 可以像使用任何引用那样使用this。
float c = -3.14f, d; d = obj.abs(c); System.out.println(c + "的绝对值是" + d); } }
方法重载的两种方式之一
利用不同数据类型的参数重载; 对于带有相同数量参数但参数类型不同的重载方法,编译器可以区分它们,
如:
int square(int x) {……} 只f要l所oa有t参s数q式ua样r都e(是f唯lo一a的t ,x就) 可{以…使…用}多个重载; 很d多o编ub程l语e 言s已qu经a重re载(了do输u出bl方e法x,)以{便…您…可以}用相同的函数名称输出任何
}
重载构造方法示例(续)
/*测试时间类*/ public class Test {
/*main方法,程序入口*/ public static void main(String[] args) {
//分别调用不同的构造方法来初始化时间对象 MyTime t1 = new MyTime(); //调用重载方式1 t1.display(); MyTime t2 = new MyTime(8); //调用重载方式2 t2.display(); MyTime t3 = new MyTime(8, 30); //调用重载方式3 t3.display(); MyTime t4 = new MyTime(8, 30, 30); //调用重载方式4 t4.display(); } }
同一作用域 温馨提示:方法重载跟方法的返回值类型没有任何关系。也就是说,
只有返回值不同的方法不能构成重载。
/*错误的方法重载*/ void fun(int x) {……}; int fun(int x) {……};
方法重载示例
public class AbsoluteValue { public int abs(int x) { return ((x >= 0) ? x : -x); } public float abs(float x) { return ((x >= 0) ? x : -x); } public double abs(double x) { return ((x >= 0) ? x : -x); } public long abs(long x) { return ((x >= 0) ? x : -x); }
float c = -3.14f, d; d = obj.absOfFloat(c); System.out.println(c + "的绝对值是" + d); } }
方法重载
用于定义一组方法,这些方法具有相同的名称,并执行类似的操作,但是却使用 不同的参数列表;
编译器会根据调用时传递的实际参数自动判断具体调用的是哪个重载方法,如:
第五课
类和对象(下)
回顾
类与对象的关系是什么? 类中的成员包括哪两种? public与private权限有什么不同? 封装对类成员定义的一般做法是什么? 试着阐述面向对象中的继承与多态? 构造方法的作用是什么? 如何创建一个对象? “世间万物皆对象”的说法正确吗?
本课案例
设计人类(Person类),描述人的年龄、身高、体重,重载三个构造 方法,分别初始化年龄、年龄和身高、年龄及身高和体重
课堂练习2
➢ 在Java中,下列方法()不能与 int fun(int x) {……} 构成方法重载。 int fun(int x, int y) {……} float fun(int z) {……} int fun(float x) {……} int fun(int x, int y, int z) {……}
/*使用重载构造方法可以使初始化对象的方式灵活机动,大 大方便类的使用者。*/
对象在内存中的存放形式
成员变量1 成员变量2
…… 成员变量n
每个对象都有自己独立 的数据成员,但是所有 的对象共享成员方法。
对象1
对象2
成员方法1 成员方法2
…… 成员方法n
对 成员变量1 象
成员变量2 ……
成员变量n
3
如果还要求其它类型的 绝对值,就需要定义更 多的方法,这对于调用 者来说,将会是非常麻 烦的事情。
public static void main(String[] args) { AbsoluteValue obj = new AbsoluteValue(); int a = -8, b; b = obj.absOfInt(a); System.out.println(a + "的绝对值是" + b);
关于方法重载的重要提示
请勿将功能完全不一 样的方法进行重载!
重载构造方法
方法重载的一个重要应用就是重载构造方法
可以定义一组构造方法,使其构成重载关系,从而 方便使用者能够灵活机动地以各种不同的方式来 实例化对象。
重载构造方法示例
class MyTime { //定义时间类 private int mHour, mMinute, mSecond; //三个成员变量,时、分、秒 public MyTime() { //构造方法重载1 mHour = 0; mMinute = 0; mSecond = 0; } public MyTime(int hour) { //构造方法重载2 mHour = hour; mMinute = 0; mSecond = 0; } public MyTime(int hour, int minute) { //构造方法重载3 mHour = hour; mMinute = minute; mSecond = 0; } public MyTime(int hour, int minute, int second) { //构造方法重载4 mHour = hour; mMinute = minute; mSecond = second; } public void display() { //显示时间信息的方法 System.out.println(mHour + ":" + mMinute + ":" + mSecond); }
➢ 在Java中,对于成员方法 float add(float f1, float f2) {……} 下面选项()是对该成员方法的重载。
int add(int n1, int n2) {……} float add(float f) {……} float add(float n2, float n1) {……} void add(float f2, float f1) {……} void add(float f1, float f2, float x) {……}
总结
方法重载可以方便方法的调用者,但方法重载应遵循三大原则 方法名相同 参数列表不同 属于同一作用域
可以适当地重载构造方法,使初始化对象的方式更加灵活 this引用总是指向调用方法的对象,this引用变量中存储的是调用该方法的对
象地址
作业
创建学生类,描述学生的姓名、年龄、身高、学历,重载三个构造方法,分别初 始化姓名、姓名和年龄、姓名及年龄和学历
this引用示例
/*this示例,代码片段*/
public class Student //定义学生类
{
private String mName; //姓名
private int mAge;
//年龄
public Student(String name, int age) {
//隐式调用,等同于this.mName = name; mName = name; //显式调用,等同于mAge = age; this.mAge = age; } …… }
方法重载的作用域规则
只有属于同一作用域范围内的方法才能构成重载。
class First {
…… public void show() {
…… } …… }
class Second {
…… public void show(int x) {
…… }
不构成重…载…
}
课堂练习1
/*求绝对值的方法*/ public int abs(int x) {
return百度文库((x >= 0) ? x : -x); }
方法的定义
/*main方法,程序入口*/
方法的调用
public static void main(String[] args)
{
//必须先实例化类的对象,才可以调用到其中的成员方法
方法重载
本章目标
重载构造方法
对象在内存中的存放形式
this关键字
回顾函数
在Java中,函数无需C语言中的前向声明,只要直接定义即可;
Java中,函数被称为方法;
定义一个方法的一般形式:
[访问权限] 返回值类型 方法名称(形参列表) { 方法主体;
方法原型
}
我们更关注的是方法原型,对于方法原型的三个主要组成部分应当明 确区分:
类型的数据。
方法重载的两种方式之二
利用不同数量的参数重载,如:
/*函数定义*/ int fun(int n1) {……} int fun(int n1, int n2, int n3) {……} /*函数调用*/ 将f调un用(a与);参数最匹配的方法,如果没有方法得出最佳匹配,那么编译器将报错; fun编(x译,器y解, 决z)重;载的方式与方法定义的顺序无关;
/*abs方法的重载*/ int abs(int x) {……} float abs(float x) {……} double abs(double x) {……} long abs(long x) {……}
方法重载的三大原则
方法名相同 参数不同(可以有三方面的不同)
数量不同 类型不同 顺序不同
但有时候,我们可能还需要求浮点数的绝对值,请问:可以继续使用这个方 法吗
事实上是行不通的,这个方法只能求出整数的绝对值,对于浮点数,还需另外再 定义求浮点数绝对值的方法。
修改案例
public class AbsoluteValue { /*求整数绝对值的方法*/ public int absOfInt(int x) { return ((x >= 0) ? x : -x); } /*求浮点数绝对值的方法*/ public float absOfFloat(float x) { return ((x >= 0) ? x : -x); }
AbsoluteValue obj = new AbsoluteValue();
int a = -8, b;
b = obj.abs(a); //调用abs方法求a的绝对值
System.out.println(a + "的绝对值是" + b);
}
}
案例分析
在上面的案例中,我们已经定义了求整数绝对值的方法
返回值类型
方法名称
形式参数
在Java中定义方法
/*Java中的方法示例 代码片段*/ 返回值类型 方法名称
/*定义求平方值的方法*/ public int square(int x) {
return (x * x); }
形式参数
案例
/*编写求绝对值的方法来求整数的绝对值*/ /*AbsoluteValue类,其中包含求绝对值的方法 Java中的任何方法都必须在类中定义*/ public class AbsoluteValue {
//重载方式1,求整数的绝对值 //重载方式2,求浮点数的绝对值 //重载方式3,求双精度数的绝对值 //重载方式4,求长整型数的绝对值
public static void main(String[] args) { AbsoluteValue obj = new AbsoluteValue(); int a = -8, b; b = obj.abs(a); System.out.println(a + "的绝对值是" + b);
成员变量1 成员变量2
…… 成员变量n
this关键字
既然所有的对象都共用相同的成员方法,那么在不同的对象都调用同一方法时, 它是怎么确定要使用哪个对象的数据成员呢?
成员方法被对象调用时都会传递一个隐含的this引用参数,它总是指向调用该 方法的对象;
关键字this给出调用成员方法的对象地址; 每当对象调用成员方法时,编译器会向this分配调用该方法的对象地址; 可以像使用任何引用那样使用this。
float c = -3.14f, d; d = obj.abs(c); System.out.println(c + "的绝对值是" + d); } }
方法重载的两种方式之一
利用不同数据类型的参数重载; 对于带有相同数量参数但参数类型不同的重载方法,编译器可以区分它们,
如:
int square(int x) {……} 只f要l所oa有t参s数q式ua样r都e(是f唯lo一a的t ,x就) 可{以…使…用}多个重载; 很d多o编ub程l语e 言s已qu经a重re载(了do输u出bl方e法x,)以{便…您…可以}用相同的函数名称输出任何
}
重载构造方法示例(续)
/*测试时间类*/ public class Test {
/*main方法,程序入口*/ public static void main(String[] args) {
//分别调用不同的构造方法来初始化时间对象 MyTime t1 = new MyTime(); //调用重载方式1 t1.display(); MyTime t2 = new MyTime(8); //调用重载方式2 t2.display(); MyTime t3 = new MyTime(8, 30); //调用重载方式3 t3.display(); MyTime t4 = new MyTime(8, 30, 30); //调用重载方式4 t4.display(); } }
同一作用域 温馨提示:方法重载跟方法的返回值类型没有任何关系。也就是说,
只有返回值不同的方法不能构成重载。
/*错误的方法重载*/ void fun(int x) {……}; int fun(int x) {……};
方法重载示例
public class AbsoluteValue { public int abs(int x) { return ((x >= 0) ? x : -x); } public float abs(float x) { return ((x >= 0) ? x : -x); } public double abs(double x) { return ((x >= 0) ? x : -x); } public long abs(long x) { return ((x >= 0) ? x : -x); }
float c = -3.14f, d; d = obj.absOfFloat(c); System.out.println(c + "的绝对值是" + d); } }
方法重载
用于定义一组方法,这些方法具有相同的名称,并执行类似的操作,但是却使用 不同的参数列表;
编译器会根据调用时传递的实际参数自动判断具体调用的是哪个重载方法,如:
第五课
类和对象(下)
回顾
类与对象的关系是什么? 类中的成员包括哪两种? public与private权限有什么不同? 封装对类成员定义的一般做法是什么? 试着阐述面向对象中的继承与多态? 构造方法的作用是什么? 如何创建一个对象? “世间万物皆对象”的说法正确吗?
本课案例
设计人类(Person类),描述人的年龄、身高、体重,重载三个构造 方法,分别初始化年龄、年龄和身高、年龄及身高和体重
课堂练习2
➢ 在Java中,下列方法()不能与 int fun(int x) {……} 构成方法重载。 int fun(int x, int y) {……} float fun(int z) {……} int fun(float x) {……} int fun(int x, int y, int z) {……}
/*使用重载构造方法可以使初始化对象的方式灵活机动,大 大方便类的使用者。*/
对象在内存中的存放形式
成员变量1 成员变量2
…… 成员变量n
每个对象都有自己独立 的数据成员,但是所有 的对象共享成员方法。
对象1
对象2
成员方法1 成员方法2
…… 成员方法n
对 成员变量1 象
成员变量2 ……
成员变量n
3
如果还要求其它类型的 绝对值,就需要定义更 多的方法,这对于调用 者来说,将会是非常麻 烦的事情。
public static void main(String[] args) { AbsoluteValue obj = new AbsoluteValue(); int a = -8, b; b = obj.absOfInt(a); System.out.println(a + "的绝对值是" + b);
关于方法重载的重要提示
请勿将功能完全不一 样的方法进行重载!
重载构造方法
方法重载的一个重要应用就是重载构造方法
可以定义一组构造方法,使其构成重载关系,从而 方便使用者能够灵活机动地以各种不同的方式来 实例化对象。
重载构造方法示例
class MyTime { //定义时间类 private int mHour, mMinute, mSecond; //三个成员变量,时、分、秒 public MyTime() { //构造方法重载1 mHour = 0; mMinute = 0; mSecond = 0; } public MyTime(int hour) { //构造方法重载2 mHour = hour; mMinute = 0; mSecond = 0; } public MyTime(int hour, int minute) { //构造方法重载3 mHour = hour; mMinute = minute; mSecond = 0; } public MyTime(int hour, int minute, int second) { //构造方法重载4 mHour = hour; mMinute = minute; mSecond = second; } public void display() { //显示时间信息的方法 System.out.println(mHour + ":" + mMinute + ":" + mSecond); }
➢ 在Java中,对于成员方法 float add(float f1, float f2) {……} 下面选项()是对该成员方法的重载。
int add(int n1, int n2) {……} float add(float f) {……} float add(float n2, float n1) {……} void add(float f2, float f1) {……} void add(float f1, float f2, float x) {……}
总结
方法重载可以方便方法的调用者,但方法重载应遵循三大原则 方法名相同 参数列表不同 属于同一作用域
可以适当地重载构造方法,使初始化对象的方式更加灵活 this引用总是指向调用方法的对象,this引用变量中存储的是调用该方法的对
象地址
作业
创建学生类,描述学生的姓名、年龄、身高、学历,重载三个构造方法,分别初 始化姓名、姓名和年龄、姓名及年龄和学历
this引用示例
/*this示例,代码片段*/
public class Student //定义学生类
{
private String mName; //姓名
private int mAge;
//年龄
public Student(String name, int age) {
//隐式调用,等同于this.mName = name; mName = name; //显式调用,等同于mAge = age; this.mAge = age; } …… }