您的位置:首页技术文章
文章详情页

Java编程思想读书笔记(第5-7章)

【字号: 日期:2024-06-17 09:05:08浏览:6作者:猪猪
内容: 第2章万事万物皆对象一.所有对象都必须由你建立1.存储在哪里1.寄存器:我们在程序中无法控制2.stack:存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中3.Heap:存放用new产生的数据4.Static storage:存放在对象中用static定义的静态成员5.Constant storage:存放常量6.NON-RAM:硬盘等永久存储空间2.特例:基本型别基本类型数据存放在Stack中,存放的是数据。而产生对象时,只把对象的reference存放在stack中,用于指向某个对象,对象本身存放在Heap中。3.Java中的数组当你产生某个存储对象的数组时,真正产生的其实是存储reference的数组。引数组建立后,其中的每一个reference都会被自动设为null,表示“不指向任何对象。二.建立新的数据型别:Class1.数据成员和函数1.1基本成员的缺省值1)当class的某个成员属于基本型别时,即使你没有为它提供初值,Java仍保证它有一个缺省值。2)只有当变量身份是“class内的成员时,Java才保证为该变量提供初值。三.函数(Mehtods),引数(arguments),返回值(return values)1.引数列当引数传递的是对象时,传递的是对象的reference。四.注解用内嵌式文档Java提供两种注解风格:/*XXXX*/、//XXXX第3章控制程序流程一.使用Java运算符1.关系运算符1.) 当对两个对象运用关系运算符进行比较时,比较的是object reference,如:java/lang/Integer.java.html' target='_blank'>Integer n1 = new java/lang/Integer.java.html' target='_blank'>Integer(3);java/lang/Integer.java.html' target='_blank'>Integer n2 = new java/lang/Integer.java.html' target='_blank'>Integer(3);java/lang/System.java.html' target='_blank'>System.out.println(n1==n2);结果为false,因为两个object reference(n1和n2)值是不同的2) quals()的缺省行为也是拿referenct来比较。不过Java中的class覆写了equals方法,如:java/lang/Integer.java.html' target='_blank'>Integer n1 = new java/lang/Integer.java.html' target='_blank'>Integer(3);java/lang/Integer.java.html' target='_blank'>Integer n2 = new java/lang/Integer.java.html' target='_blank'>Integer(3);java/lang/System.java.html' target='_blank'>System.out.println(n1.quals(n2));//值为true2.逻辑运算符1)只能将and、or、not施用于boolean值身上。如果逻辑运算符两边的值存在non-boolean值,将会出错,如:int test1 = 1;java/lang/System.java.html' target='_blank'>System.out.println((test && 1String ss){}Flower(int petals, Sting ss){//petals++;调用另一个构造函数的语句必须在最起始的位置this(petals);//this(ss);会产生错误,因为在一个构造函数中只能调用一个构造函数}}**:1)在构造调用另一个构造函数,调用动作必须置于最起始的位置2)不能在构造函数以外的任何函数内调用构造函数3)在一个构造函数内只能调用一个构造函数4.Static的意义无法在static函数中调用non-static函数(反向可行)。为什么不能呢,我们看下面的例子。例4.2.4.1假设能在static函数中调用non-static函数,那么(a)处就将出错。因为在没有产生Movie class实例之前,在就不存在Movie class内的name实例,而在getName()中却要使用name实例,显然的错误的。class Movie{java/lang/String.java.html' target='_blank'>String name = “;Movie(){}public Movie(java/lang/String.java.html' target='_blank'>String name) { this.name = name; }public static java/lang/String.java.html' target='_blank'>String getName() { return name; }}public class Test{public static void main(java/lang/String.java.html' target='_blank'>String[] args){//下面两名先产生实例后再调用getName()没有问题//Movie movie1 = new Movie(“movie1);//String name1 = movie1.getName();//下面一名将出错//String name2 = Movie.getname(); (a)}}三.清理(cleanup):终结(finalization)与垃圾回收(garbage collection)1)你的对象可能不会被回收只有当程序不够内存时,垃圾回收器才会启动去回收不再被使用的对象的内存空间。某个对象所占用的空间可能永远不会被释放掉,因为你的程序可能永远不会逼近内存用完的那一刻,而垃圾回收器完全没有被启动以释放你的对象所占据的内存,那些空间便会在程序终止时才一次归还给操作系统3)只有在采用原生函数(native methods)时,才使用finalize()。四.成员初始化(member initialization)1)函数中的变量不会被自动初始化,如void f(){int i;i++;}将发生编译错误,因为i没有被初始化。2)class的数据成员会被自动初始化,具体情况如下(见P220例子):基本型别:boolean:false、char:null(u0000)、byte:0、short:0、int:0、long:0 、float:0、double:0第6章重复运用classes一.继承(inheritance)1.在derived class中overriding某个函数时,只能覆写base class中的接口,即base class中的public或protected或friendly函数。如果试图overriding一个private函数,虽然编译通过,但实际上你只是在derived class中添加了一个函数。如class Cleanser{private void prt(){//(b)java/lang/System.java.html' target='_blank'>System.out.println('Cleanser.prt()');}}public class ExplicitStatic extends Cleanser{public void prt(){java/lang/System.java.html' target='_blank'>System.out.println('ExplicitStatic.prt()');}public static void main(java/lang/String.java.html' target='_blank'>String[] args){Cleanser x = new ExplicitStatic();x.prt();//(a)}}因为Cleanser中的prt()是private,所以不能在其derived class中被覆写。ExplicitStatic中的prt()只是ExplicitStatic中的一个函数,所以当试图在(a)处通过多态来调用prt()时,会发生错误。如果把(b)处的private去掉,则结果为ExplicitStatic.prt()2.Super的使用1)通过关键字super可以调用当前class的superclass(父类)。例6.1.1.1class Base{Base(){java/lang/System.java.html' target='_blank'>System.out.println('Base()');}public void scrub() { java/lang/System.java.html' target='_blank'>System.out.println(' Base.scrub()'); }}class Cleanser extends Base{private java/lang/String.java.html' target='_blank'>String s = new java/lang/String.java.html' target='_blank'>String('Cleanser');public void append(java/lang/String.java.html' target='_blank'>String a) { s+=a; }public void dilute() { append(' dilute()'); }public void apply() { append(' apply()'); }public void scrub() { append(' scrub()'); }public void print() { java/lang/System.java.html' target='_blank'>System.out.println(s); }Cleanser(){java/lang/System.java.html' target='_blank'>System.out.println('Cleanser(): ' + s);}public static void testStatic(){java/lang/System.java.html' target='_blank'>System.out.println('testStatic()');}public static void main(java/lang/String.java.html' target='_blank'>String[] args){Cleanser x = new Cleanser();x.dilute(); x.apply(); x.scrub(); x.print();}}public class ExplicitStatic extends Cleanser{ExplicitStatic(){java/lang/System.java.html' target='_blank'>System.out.println('ExplicitStatic()');}public void scrub(){append(' Detergen.scrub()');super.testStatic();super.scrub();//调用的是Cleanser.scrub()}public void foam() { append(' foam()'); }public static void main(java/lang/String.java.html' target='_blank'>String[] args){ExplicitStatic x = new ExplicitStatic();x.dilute(); x.apply(); x.scrub(); x.foam();x.print(); java/lang/System.java.html' target='_blank'>System.out.println('Test base class:');Cleanser.main(args);testStatic();}}运行结果:Base()Cleanser(): CleanserExplicitStatic()testStatic()Cleanser dilute() apply() Detergen.scrub() scrub() foam()Test base class:Base()Cleanser(): CleanserCleanser dilute() apply() scrub()testStatic()2)通过super来调用superclass中的成员时,调用的是最近成员。例6.1.1.2class Base{protected java/lang/String.java.html' target='_blank'>String baseS = 'Base';//(a)//private String baseS = 'Base';Base(){java/lang/System.java.html' target='_blank'>System.out.println('Base()');}}class Cleanser extends Base{protected java/lang/String.java.html' target='_blank'>String baseS = 'Cleanser';//(b)public java/lang/String.java.html' target='_blank'>String s = new java/lang/String.java.html' target='_blank'>String('Cleanser');Cleanser(){java/lang/System.java.html' target='_blank'>System.out.println('Cleanser(): ' + s);}Cleanser(java/lang/String.java.html' target='_blank'>String a){java/lang/System.java.html' target='_blank'>System.out.println('Cleanser(' + a + '): s = ' + s );}}public class ExplicitStatic extends Cleanser{java/lang/String.java.html' target='_blank'>String s2 = s;java/lang/String.java.html' target='_blank'>String baseS = super.baseS; //(c)ExplicitStatic(){super('ExplicitStatic');java/lang/System.java.html' target='_blank'>System.out.println('ExplicitStatic():s2 = ' + s2 + ', baseS = '+ baseS + 'super.baseS = ' + super.baseS);baseS = 'ExplicitStatic';java/lang/System.java.html' target='_blank'>System.out.println('baseS = ' + baseS + ' , super.baseS = ' + super.baseS);}public static void main(java/lang/String.java.html' target='_blank'>String[] args){ExplicitStatic x = new ExplicitStatic();}}结果1:Base()Cleanser(ExplicitStatic): s = CleanserExplicitStatic():s2 = Cleanser, baseS = Cleanser,super.baseS = CleanserbaseS = ExplicitStatic , super.baseS = Cleanser在上面例子中,在三个class中都存在String bases实例。在ExplicitStatic中如果直接调用baseS,则实际调用的是当前类ExplicitStatic中的baseS(即(c)处的成员);如果通过super.bases来调用baseS,则调用的是离当前类ExplicitStatic最近的baseS成员,即Cleanser class中的baseS实例(即(b)处),产生的结果如结果1所示。如果把(b)处语句注释掉,则将调用Base class中的baseS,结果如结果2所示。结果2:Base()Cleanser(ExplicitStatic): s = CleanserExplicitStatic():s2 = Cleanser, baseS = Base,super.baseS = BasebaseS = ExplicitStatic , super.baseS = Base3.Base class的初始化2.1当你产生derived class对象时,其中会包含base class子对象(subobject)。这个子对象就和你另外产生的base class对象一模一样。2.2通过super()可调用base class的构造函数,但必须放在构造函数的第一行,并且只能在构造函数中运用。2.3初始化顺序为:1)加载代码(.class文件)2)初始化class的静态成员,初始化顺序了“从里到外,即从base class开始。3)在derived class的构造函数中调用base class的构造函数。如果在derived class的构造函数中没有通过super()显式调用调用base class的构造函数,编译器会调用bass class的default构造函数并自动生成相应的调用语句,从而产生一个base class实例。如果在derived class的构造函数中通过super()显示调用了父类的构造函数,则调用所指定的构造函数。调用构造函数的调用顺序是“从里到外。4)调用derived class的构造函数。**:当base class没有default构造函数时,必须在derived class的构造函数中通过super显示调用base class的构造函数。例:下面代码的初始化过程为:1)装载ExplicitStatic的代码(装载ExplicitStatic.class文件)。2)发现ExplicitStatic有关键字extends,装载ExplicitStatic的base class的代码(装载Cleanser.class文件)。3)发现Cleanser有关键字extends,装载Cleanser的base class的代码(装载Base.class文件)。4)初始化Base class中的静态成员。5)初始化Cleanser class中的静态成员。6)初始化ExplicitStatic class中的静态成员。如果把(c)处的代码注释掉,那么初始化工作到此就结束了。7)为ExplicitStatic对象分配存储空间,并把存储空间初始化为0。8)在ExplicitStatic class的构造中调用super('ExplicitStatic')(在ExplicitStatic class的构造函数中显式调用父类的构造函数),试图产生一个Cleanser class实例。9)为Cleanser对象分配存储空间,并把存储空间初始化为0。10)由于Cleanser class又是继承自Base class, Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
标签: Java
相关文章: