第五讲 对象的初始化
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
new 类名(参数)
类中方法的重载
构造方法的重载 构造方法重载是指一个类中可定义多个构造方法,这样对象初始化就可灵活 多样。构造方法重载时,参数必不同,这个不同可以体现在参数的类型或个数上。 在具体创建一个对象时,重载的构造方法中,只有一个参数匹配的构造方法得以 执行。 例:阅读程序,分析程序结果,理解构造方法重载的意义。 class NewFlower{ static int num = 0; NewFlower(){ //① num ++; System.out.println(num + "朵花开了!"); } NewFlower(String color){ //② num ++; System.out.println(num+"朵花开了........是"+color+"花!"); } public static void main(String[] args){ new NewFlower(); //无参数,调用① new NewFlower("红"); //带参数,调用② new NewFlower("蓝"); //带参数,调用② } } 程序运行结果:
Java 语言程序设计
第五讲 对象的初始化
主要内容
用构造方法确保初始化 方法的重载 this 关键字 类中成员变量的默认值 对象的初始化过程 用构造方法确保初始化
缺省构造方法
javap.exe 观察类框架
在 JDK 安装目录下的 bin 目录下,有一个文件 javap.exe,它是一个反编译 的类察看器,可用它来观察类框架。如: D:\Javawork\Lesson4>javap Person Compiled from "Person.java" class Person extends java.lang.Object{ int sex; int salary; Person(); void employed(); } 观察:类框架中多了哪一项?
类中成员变量的默认值
类中成员变量的默认值 对象的成员变量可赋予初值,如果没有对成员变量预先赋初值,则在创建变 量时会自动初始化(默认初值) 。其要点是: 数值型的成员变量,默认值为 0; 布尔型的成员变量,默认值为 false; 引用型的成员变量,默认值为空(null); 例:阅读程序,分析程序运行结果。 class TestInitA{ int x; Circle y; boolean z; public static void main( String[ ] args ){ TestInitA ti=new TestInitA(); System.out.println( "x is " + ti.x ); System.out.println( "y is " + ti.y ); System.out.println("z is "+ ti.z); }
1 朵花开了! 2 朵花开了........是红花!
Java 语言程序设计
3 朵花开了........是蓝花!
例:构造一个矩形类 Rectangle,可接收一个或两个参数作为边长(如果传 递过来一个参数,作正方形处理) ,类中包含求矩形面积的方法。在 main 方法中 求: (1) 长 2.3,宽 4.5 矩形面积; (2) 边长为 7.6 的正方形面积。 class Rectangle{ double w; double h; Rectangle(double x){ //正方形,长宽相同 w = h = x; } Rectangle(double x, double y){ //矩形 w = x; h = y; } double getS(){ return w * h; } } class Test{ public static void main(String[] args){ System.out.println(new Rectangle(2.3,4.5).getS()); System.out.println(new Rectangle(7.6).getS()); } } 重载本身意指同一个类中同一个方法名有多重意义 ,构造方法可以重载,一 ...................... 般的成员方法也可以重载。 成员方法的重载 成员方法重载的实现是,同一个类中定义了多个同名方法,与重载的构造方 法一样,重载的成员方法的参数须是各不相同的。 例:阅读程序,理解成员方法的重载。 class TestOL{ int x; void func(){System.out.println("no arg");}
Java 语言程序设计
class Flower{ static int num=0; //静态变量 Flower(){ //构造方法 num++; System.out.println(num+"朵花开了!"); } public static void main(String[] args){ new Flower(); new Flower(); new Flower(); } } 思考 1. 2. 3. 4. 5. 构造方法有什么用? 每个类都有构造方法吗? 构造方法的命名和类型修饰? 构造方法的执行时机? 如果希望创建对象时,传递给对象中的变量初值,怎么 实现? 6. 回顾 new 运算,new 类名(参数),其中的参数什么时候 带,什么时候不带? 7. 如果一个类定义了带参的构造方法, 可以用 new 类名() 创建该类的对象吗? 说明:构造方法不可声明返回类型(包括 void) 。如说明编译器将把它看作 为一个一般的方法,而不是构造方法。 练习:构造一个可接受半径 Circle 类,并含有求圆面积的方法 getS 和求圆 周长的方法 getL。通过 Circle 类的实例化对象,分别求半径为:2、3.5 的圆面 积和圆周长。 class CleverCircle{
对象的初始化过程
对象的基本初始化过程 初始化时涉及到成员变量和构造方法; 实例变量的初始化在构造方法之前。 程序一: class TestInitC{ int x=3; TestInitC(){ x=5; } public static void main( String[ ] args ){ TestInitC t=new TestInitC(); System.out.println(t.x ); } } 程序运行结果是 3 还是 5? 程序二: class TestInitD{ TestInitD(int a){ x = a; } public static void main( String[] args ){ System.out.println( new TestInitD(5).x ); } int x = 3;
Java 语言程序设计
} 但是,方法中的变量是没有默认值的,如果一个变量在方法中定义,那么使 用这个变量前必须赋值。 class TestInitB{ public static void main( String[ ] args ){ int x; System.out.println( "\nx is " + x ); } }
构造方法的初步认识
构造方法的名字和类名相同,无类型修饰,没有返回值; 所有类都有构造方法,如果程序中没定义,编译器会自动提供缺省的构 造方法; 构造方法可带参数,以接收用来初始化的数据。但缺省的构造方法不带 参数,不能接收数据,并且方法体为空。 主动在类中引入构造方法 例:阅读程序,理解构造方法。
Java 语言程序设计
请思考一下: (1) 重载一个原型为 void func(float)的方法会怎样? (2) 对 void func(int x)整行注释又会怎样? (3) 在 main 方法中末尾加一条 c.func(‘a’)会有怎样的输出呢? 练习: 构造一个包含有求累加和方法 sum 的类 MyCal, sum 方法可接受一个或 两个整型参数,如果是一个参数,则是从自然数 1 开始的累加;如果是两个参数 m 和 n,求的是从其中较小数到较大数的累加和。
this 关键字
在方法内使用,表示调用方法的这个对象(当前对象) 。 this.变量名-------访问当前对象的变量 this.方法名(参数) ;----------访问当前对象的方法 this(参数);----------调用重载的构造方法 访问对象的成员变量 例:阅读程序,理解用 this 访问对象成员变量的意义。 class ThisTest{ int a; ThisTest(int a){ //参数与成员变量同名 this.a = a; //成员变量 a 取得参数值 a ++; } public static void main(String[] args){ System.out.println(new ThisTest(5).a); //结果是? } } 访问当前对象的方法 class TestB{ int a,b; TestB(int a,int b){ this.a = a; this.b = b; System.out.println(a+"---"+b+"\t"+this.sum()); //调用方法 } TestB(int a){
Java 语言程序设计
Biblioteka Baidu
String func(int i){ return "arg is "+i; } void func(String s){ System.out.println(s); } public static void main(String[] args){ TestOL c=new TestOL(); c.func(); c.func(c.func(100)); } } 成员方法重载的实质是,同一个方法名,被赋予了多个意义。多个同名方法 可对应于不同的处理。 说明:如果方法的名称和参数一致,而仅仅是返回值类型相异,则无法实现 重载。 思考:下面哪些方法是重载的? (1) int f(){„} (2) void f(){„} (3) void f(int a,int b){„} (4) void f(String c){„} 重载时方法的窄化转型 如果调用(或自动执行)方法时,传递的实参类型与方法中的形式参数类型 不一致,就会采用窄化转型,即传递的实参“小于”方法中声明的形参,实参就 会自动提升一级。 例:阅读程序,分析程序运行结果。 class TestOL{ void func(double x){System.out.println(x+" is double");} void func(int x){System.out.println(x+" is int");} public static void main(String[] a){ TestOL c=new TestOL(); c.func(1); c.func(2.5); c.func(3.5f); } }
} class Test{
Java 语言程序设计
public static void main(String[] args){ CleverCircle cc = new CleverCircle(2); System.out.println(cc.getL() + "\t\t" + cc.getS()); cc = new CleverCircle(3.5); System.out.println(cc.getL() + "\t\t" + cc.getS()); } } 由带参构造方法的类创建对象时,需在类名后附带合适的参数,格式如:
Java 语言程序设计
this(1, a);
//调用重载的构造方法
} int sum(){ int s = 0; for(int i=a; i<=b; i++) s += i; return s; } public static void main(String[] args){ new TestB(10,20); new TestB(100); } } 思考 1. 方法中的变量与类的成员变量可否同名? 2. 若同名时,在方法中如何访问成员变量? 3. 如何在类方法中调用同类中的方法?