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