资源描述
” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 类与对象的关系是什么? 类中的成员包括哪两种? public与private权限有什么不同? 封装对类成员定义的一般做法是什么? 试着阐述面向对象中的继承与多态? 构造方法的作用是什么? 如何创建一个对象? “世间万物皆对象”的说法正确吗?” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)设计人类(Person类),描述人的年龄、身高、体重,重载三个构造方法,分别初始化年龄、年龄和身高、年龄及身高和体重” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 方法重载 重载构造方法 对象在内存中的存放形式 this关键字” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)在Java中,函数无需C语言中的前向声明,只要直接定义即可;Java中,函数被称为方法;定义一个方法的一般形式:访问权限 返回值类型 方法名称(形参列表) 方法主体;我们更关注的是方法原型,对于方法原型的三个主要组成部分应当明确区分:返回值类型方法名称形式参数方法原型方法原型” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)/*Java中的方法示例中的方法示例代码片段代码片段*/*定义求平方值的方法定义求平方值的方法*/public int square(int x) return (x * x);返回值类型返回值类型方法名称方法名称形式参数形式参数” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)/*编写求绝对值的方法来求整数的绝对值编写求绝对值的方法来求整数的绝对值*/*AbsoluteValue类,其中包含求绝对值的方法类,其中包含求绝对值的方法Java中的任何方法都必须在类中定义中的任何方法都必须在类中定义*/public class AbsoluteValue /*求绝对值的方法求绝对值的方法*/ public int abs(int x) return (x = 0) ? x : -x); /*main方法,程序入口方法,程序入口*/ public static void main(String args) /必须先实例化类的对象,才可以调用到其中的成员方法必须先实例化类的对象,才可以调用到其中的成员方法 AbsoluteValue obj = new AbsoluteValue(); int a = -8, b; b = obj.abs(a); /调用调用abs方法求方法求a的绝对值的绝对值 System.out.println(a + 的绝对值是的绝对值是 + b); 方法的定义方法的定义方法的调用方法的调用” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 在上面的案例中,我们已经定义了求整数绝对值的方法 但有时候,我们可能还需要求浮点数的绝对值,请问:可以继续使用这个方法吗 事实上是行不通的,这个方法只能求出整数的绝对值,对于浮点数,还需另外再定义求浮点数绝对值的方法。” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)public class AbsoluteValue /*求整数绝对值的方法求整数绝对值的方法*/ public int absOfInt(int x) return (x = 0) ? x : -x); /*求浮点数绝对值的方法求浮点数绝对值的方法*/ public float absOfFloat(float x) return (x = 0) ? x : -x); public static void main(String args) AbsoluteValue obj = new AbsoluteValue(); int a = -8, b; b = obj.absOfInt(a); System.out.println(a + 的绝对值是的绝对值是 + b); float c = -3.14f, d; d = obj.absOfFloat(c); System.out.println(c + 的绝对值是的绝对值是 + d); 如果还要求其它类型的如果还要求其它类型的绝对值,就需要定义更绝对值,就需要定义更多的方法,这对于调用多的方法,这对于调用者来说,将会是非常麻者来说,将会是非常麻烦的事情。烦的事情。” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 用于定义一组方法,这些方法具有相同的名称,并执行类似的操作,但是却使用不同的参数列表; 编译器会根据调用时传递的实际参数自动判断具体调用的是哪个重载方法,如:/*abs方法的重载方法的重载*/int abs(int x) float abs(float x) double abs(double x) long abs(long x) ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)方法名相同参数不同(可以有三方面的不同)数量不同类型不同顺序不同同一作用域温馨提示:方法重载跟方法的返回值类型没有任何关系。也就是说,只有返回值不同的方法不能构成重载。/*错误的方法重载错误的方法重载*/void fun(int x) ;int fun(int x) ;” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)public class AbsoluteValue public int abs(int x) /重载方式重载方式1,求整数的绝对值,求整数的绝对值 return (x = 0) ? x : -x); public float abs(float x) /重载方式重载方式2,求浮点数的绝对值,求浮点数的绝对值 return (x = 0) ? x : -x); public double abs(double x) /重载方式重载方式3,求双精度数的绝对值,求双精度数的绝对值 return (x = 0) ? x : -x); public long abs(long x) /重载方式重载方式4,求长整型数的绝对值,求长整型数的绝对值 return (x = 0) ? x : -x); public static void main(String args) AbsoluteValue obj = new AbsoluteValue(); int a = -8, b; b = obj.abs(a); System.out.println(a + 的绝对值是的绝对值是 + b); float c = -3.14f, d; d = obj.abs(c); System.out.println(c + 的绝对值是的绝对值是 + d); ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 利用不同数据类型的参数重载; 对于带有相同数量参数但参数类型不同的重载方法,编译器可以区分它们,如: 只要所有参数式样都是唯一的,就可以使用多个重载; 很多编程语言已经重载了输出方法,以便您可以用相同的函数名称输出任何类型的数据。int square(int x) float square(float x) double square(double x) ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 利用不同数量的参数重载,如: 将调用与参数最匹配的方法,如果没有方法得出最佳匹配,那么编译器将报错;编译器解决重载的方式与方法定义的顺序无关;重载不考虑方法的返回值类型。/*函数定义函数定义*/int fun(int n1) int fun(int n1, int n2, int n3) /*函数调用函数调用*/fun(a);fun(x, y, z);” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 只有属于同一作用域范围内的方法才能构成重载。class First public void show() class Second public void show(int x) 不构成重载不构成重载” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 在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) ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 在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) ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)请勿将功能完全不一请勿将功能完全不一样的方法进行重载!样的方法进行重载!” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 方法重载的一个重要应用就是重载构造方法 可以定义一组构造方法,使其构成重载关系,从而方便使用者能够灵活机动地以各种不同的方式来实例化对象。” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)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); ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)/*测试时间类测试时间类*/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(); /*使用重载构造方法可以使初始化对象的方式灵活机动,大使用重载构造方法可以使初始化对象的方式灵活机动,大大方便类的使用者。大方便类的使用者。*/” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)成员方法成员方法1成员方法成员方法2成员方法成员方法n成员变量成员变量1成员变量成员变量2成员变量成员变量n成员变量成员变量1成员变量成员变量2成员变量成员变量n成员变量成员变量1成员变量成员变量2成员变量成员变量n对象对象1对象对象3对象对象2每个对象都有自己独立每个对象都有自己独立的数据成员的数据成员,但是所有但是所有的对象共享成员方法。的对象共享成员方法。” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 既然所有的对象都共用相同的成员方法,那么在不同的对象都调用同一方法时,它是怎么确定要使用哪个对象的数据成员呢? 成员方法被对象调用时都会传递一个隐含的this引用参数,它总是指向调用该方法的对象; 关键字this给出调用成员方法的对象地址; 每当对象调用成员方法时,编译器会向this分配调用该方法的对象地址; 可以像使用任何引用那样使用this。” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)/*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; ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 方法重载可以方便方法的调用者,但方法重载应遵循三大原则方法名相同参数列表不同属于同一作用域 可以适当地重载构造方法,使初始化对象的方式更加灵活 this引用总是指向调用方法的对象,this引用变量中存储的是调用该方法的对象地址” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 创建学生类,描述学生的姓名、年龄、身高、学历,重载三个构造方法,分别初始化姓名、姓名和年龄、姓名及年龄和学历” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)
展开阅读全文