Wednesday 28 March 2007

java修饰符 学习笔记

this:这是因为init()方法的参数名与类的成员变量x,y的名字相同,而参数名会隐藏成员变量,所以在方法中,为了区别参数和类的成员变量,我们必须使用thisthis-----用在一个方法中引用当前对象,它的值是调用该方法的对象。返回值须与返回类型一致,或者完全相同,或是其子类。当返回类型是接口时,返回值必须实现该接口。
不能用在static声明的方法中!也就是不能用在main.
super:类方法中不能使用thissuper关键字。

final:常量;方法不能被重写;
      修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。
      final修饰方法,则该方法不能被子类重写.
      final修饰类,则类不能被继承.
static:静态变量(类变量);类方法,可通过类名直接调用
       被声明在静态(类)方法main()中的变量,是一种局部变量,只能在main()里使用。
----
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.
 
       非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中..
      非静态成员是你声明的时候,实例化的时候才会分配内存
----
       类字段是用static修饰的字段。此字段属类本身,意思是只存有一份数据。并没有因实例的产生而被复制。若再加上fianl修饰符,表示此类字段不能再被更动,这个字段就算是一个常数(constant)。
----
    如果在声明时不用static 关键字修饰,则声明为实例变量和实例方法。
  1 实例变量和类变量
  每个对象的实例变量都分配内存,通过该对象来访问这些实例变量,不同的实例变量是不同的。
  类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量,每个实例对象对类变量的改变都会影响到其它的实例对象。类变量可通过类名直接访问,无需先生成一个实例对象,也可以通过实例对象访问类变量。

  2 实例方法和类方法
  实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,实例方法由实例对象调用。
  但类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可由实例对象进行调用。类方法中不能使用thissuper关键字。

  例3-7 是关于实例成员和类成员的例子。
【例3-7
  class Member {
    static int classVar;
    int instanceVar;
    static void setClassVar(int i) {
     classVar=i;
     // instanceVar=i; // 类方法不能访问实例变量
    }
    static int getClassVar()
     { return classVar; }
    void setInstanceVar(int i)
     { classVar=i; //实例方法不但可以访问类变量,也可以实例变量
     instanceVar=i; }
     int getInstanceVar( )
     { return instanceVar; }
    }
    public class MemberTest{
     public static void main(String args[]) {
         Member m1=new member();
         Member m2=new member();
         m1.setClassVar(1);
         m2.setClassVar(2);
         System.out.println("m1.classVar="+m1.getClassVar()+"
                   m2.ClassVar="+m2.getClassVar());
         m1.setInstanceVar(11);
         m2.setInstanceVar(22);
         System.out.println("m1.InstanceVar="+m1.getInstanceVar
              ()+" m2.InstanceVar="+m2.getInstanceVar());
     }
    }

运行结果:
c:\> java MemberTest
m1.classVar=2 m2.classVar=2/*这说明:类变量仅在生成第一个对象时分配内存,所有实例对象共享同一个类变量,每个实例对象对类变量的改变都会影响到其它的实例对象。*/
m1.InstanceVar=11 m2.InstanceVar=22

----
abstract:
抽象方法,没有方法体
          抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。

 

synchronized: 控制多个并发线程的访问
              在同一时间内,只有一个此种的方法在执行,即调用用此修饰符修饰的方法和对象(引用),只有一个线程会调用.在这里可以应用wait(),notify(),notifyAll()

transient: 暂时性变量,用于对象存档.不会保存在相应的内存中
volatile: 贡献变量,用于并发线程的共享:告诉编译器被其修饰的变量可以被程序的其他部分改变.

isstanceof: "object instanceof type",如果object是指定的类型或者可以被强制转换成制定类型,则这个语句返回ture.
strictfp:  Java 2中出现的.使得Java的浮点计算不会被切断.strictfp修饰的类其内部的方法和变量都是浮点型的.

native: 调用本地代码,程序或者第三方库时使用.<Java2参考大全(第四版)>P235

 

----------------------------------
类型转换:

 

& 父类 可以引用子类的对象,:父类 子类对象   ;此时,父类的对应方法和变量变成对应子类定义的内容.
  但是!:不可以:              子类 父类对象  X;子类对象中的方法和变量,父类中没有,不能体现扩展后的子类的特点.
& instanceof: object instanceof Class可以判断是否可以转换

& 没有相互继承关系的,即没有高级低级关系的不能转换.

----
引用 Reference:

& A a=b;where aA类的对象,B类对象b的引用.此时A是父类,B是子类是ok.父类对象a的方法和常量将会用子类对象b.

 

-----------------------------------
public:
类中限定为public的成员,可以被所有的类访问

 

       每个文件中只能有一个public类用来表现单一的接口,文件内可以存在为了支持public类而存在的friendly

private:子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。
    类中限定为private的成员,只能被这个类本身访问。
  如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
&   先想想私房钱的概念,私房钱只所以这么叫,是因为这个钱只有本人自己才能使用。所以private代表的意思就是说除了class本身,没有谁再能访问他了。private充分体现了封装性  

procteced:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
&         大熊猫是受到保护的,并且他的子女因为继承大熊猫的关系也是受到保护的,所以protected的意义在于允许派生类访问基类的成员,而基类的包中的其他类也是可以访问的

friendly:
(default):
类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。

-------
class
的访问权限:

     把关键字放在class之前,可以声明该class的访问权限,需要注意的是
     1、每个文件中只能有一个public类用来表现单一的接口,文件内可以存在为了支持public类而存在的friendly类;
     2public类的名称必须和所在文件的文件名相同,包括大小写也要一致;
     3、当文件内不包含任何public类的时候,你可以使用任意名称做为文件名;
     4class的访问控制符不能是private或者是protected的,只能是friendlypublic的,如果你希望别人无法产生对象,你只要把构造函数声明为private的就可以了

 

-----------------------------------
二维简单数据类型数组的动态初始化如下:

 

  int a[ ][ ] = new int[2][ ]
  a[0] = new int[3];
  a[1] = new int[5];

  对二维复合数据类型的数组,必须首先为最高维分配引用空间,然后再顺次为低维分配空间。
  而且,必须为每个数组元素单独分配空间。

  例如:
  String s[ ][ ] = new String[2][ ];
  s[0]= new String[2];//为最高维分配引用空间
  s[1]= new String[2]; //为最高维分配引用空间
  s[0][0]= new String("Good");// 为每个数组元素单独分配空间
  s[0][1]= new String("Luck");// 为每个数组元素单独分配空间
  s[1][0]= new String("to");// 为每个数组元素单独分配空间
  s[1][1]= new String("You");// 为每个数组元素单独分配空间

 

-----------------------------------
方法声明:

 

  方法声明包括方法名、返回类型和外部参数。其中参数的类型可以是简单数据类型,也可以是复合数据类型(又称引用数据类型)。

  对于简单数据类型来说,java实现的是值传递,方法接收参数的值,但不能改变这些参数的值。如果要改变参数的值,则用引用数据类型,因为引用数据类型传递给方法的是数据在内存中的地址,方法中对数据的操作可以改变数据的值。

----
构造方法

   构造方法是一个特殊的方法。Java 中的每个类都有构造方法,用来初始化该类的一个对象。
   构造方法具有和类名相同的名称,而且不返回任何数据类型。
   重载经常用于构造方法。
   构造方法只能由new运算符调用

 

--------------------------------------
String
操作:

 

     String中对字符串的操作不是对源操作串对象本身进行的,而是对新生成的一个源操作串对象的拷贝进行的,其操作的结果不影响源串。
  相反,StringBuffer中对字符串的连接操作是对源串本身进行的,操作之后源串的值发生了变化,变成连接后的串。

    String s=new StringBuffer("he is").append(age).append("years old").toString();

    equals( )equalsIgnoreCase( )
  它们与运算符'= ='实现的比较是不同的。运算符'= ='比较两个对象是否引用同一个实例,而equals( )equalsIgnoreCase( )则比较  两个字符串中对应的每个字符值是否相同。

 

---------------------------------------
接口:

 

& interface的意思是"所有'实现'这个接口的类都应该长这个样子."因此任何程序,只要用到了这个interface就都知道它有哪些方法可供调用了,仅此而已.因此,interface会被用做定义类之间的"协议(protocol)".
& interface没有方法和正文.可以包含数据成员,但是它天生就是staticfinal.
& 定义接口,必须用public或者default.
& 在类内实现接口方法的方法,必须是public,以供调用.
& 如果一个类包含一个接口,但是不完全实现接口定义的方法,那么该类必须定义成abstract.
&* <Java2参考大全(第四版)>P172:程序中,mystack(接口)IntStack接口的一个引用,InStack mystack=new InStack();.因此,当它引用ds(dynamic stack),它使用DynStack实现的push()pop()方法.当它引用fs(fixed stack),它试用FixedStack定义的push()pop().这些都是在运行时做出的,(而不是在编译时)做出的[因为java中在运行时动态查询方法与通常的方法调用相比会有一个非常庞大的花费.所以再对性能要求高的代码中不应该随意的试用接口].通过接口引用变量获得接口的多重实现是java完成运行时多态的最有力的方法.

& 任何实现接口的类都必须实现该接口定义的所有方法,包括从其他接口继承的任何方法.
----
& 关于内部类:
java内部类有什么好处?为什么需要内部类?
  首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。
  不过你可能要质疑,更改一下方法的不就行了吗?
  的确,以此作为设计内部类的理由,实在没有说服力。
  真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题――没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。

 

-----------------------------------------
异常处理

 

& try后接catch或者finally
& try中遇到throw,其后的语句将不执行,直接找try后的catch或者finally
& 方法可能会产生异常,这一方法并不确切地知道该如何对这一异常事件进行处理,在声明方法的时候要在其后加throws .....;throw是在方法中抛出意外.

 

------------------------------------------
线程

 

& 创建新线程 (1.实现Runnable接口的类,重写接口的run方法;2.继承Thread.)
& 任何实现接口Runnable的对象都可以作为一个线程的目标对象,类Thread本身也实现了接口Runnable
& 不管何种方法,run()都是新线程的入口.start()使得这个线程开始运行,执行run()方法的内容.
----
& 线程间通信:wait(),notify(),notifyAll()只能在synchronized方法中才能被调用.
& wait(),notify(),notifyAll()是针对synchronized的方法的,操纵的是进入此方法唯一的线程;run(),start(),sleep()都是线程自身的方法,要指明是哪个线程的方法如:t.start()

 

------------------------------------------
Applet

 

& init()[start()stop()]destroy().按顺序

1 init( )
  创建Applet时执行,只执行一次
  当小应用程序第一次被支持Java的浏览器加载时,便执行该方法。在小应用程序的生命周期中,只执行一次该方法,因此可以在其中进行一些只执行一次的初始化操作,如处理由浏览器传递进来的参数、添加用户接口组件、加载图像和声音文件等。
小应用程序有默认的构造方法,但它习惯于在init()方法中执行所有的初始化,而不是在默认的构造方法内。

  2start( )
  多次执行,当浏览器从图标恢复成窗口,或者是返回该主页时执行。
  系统在调用完init()方法之后,将自动调用start()方法。而且每当浏览器从图标恢复为窗口时,或者用户离开包含该小应用程序的主页后又再返回时,系统都会再执行一遍start()方法。start()方法在小应用程序的生命周期中被调用多次,以启动小应用程序的执行,这一点与init()方法不同。该方法是小应用程序的主体,在其中可以执行一些需要重复执行的任务或者重新激活一个线程,例如开始动画或播放声音等。

  3stop( )
  多次执行,当浏览器变成图标时,或者是离开主页时执行,主要功能是停止一些耗用系统资源的工作,
  与start()相反,当用户离开小应用程序所在页面或浏览器变成图标时,会自动调用stop()方法。因此,该方法在生命周期中也被多次调用。这样使得可以在用户并不注意小应用程序的时候,停止一些耗用系统资源的工作(如中断一个线程),以免影响系统的运行速度,且并不需要去人为地去调用该方法。如果你的小应用程序中不包含动画、声音等程序,通常也不必重载该方法。

  4destroy( )
  用来释放资源,在stop( )之后执行
  浏览器正常关闭时,Java自动调用这个方法。destroy()方法用于回收任何一个与系统无关的内存资源。当然,如果这个小应用程序仍然处于活动状态,Java会在调用destroy()之前,调用stop()方法。


------------------------------------------
输入输出I/O

 

& 向程序台输出最好用用国际化的PrintWriter,因为其是基于字符类.
  PrintWriter(OutputStream outpustream, boolean flushonNewline)
  实际编程时写为: PrintWriter pw=new PrintWriter(Syetem.out,true);
                  pw.println();
& 文件读写是基于字节流
  FileInputStream(String fileName) throws FileNotFoundException
  读写结束必须close();
  read(),write()等方法;read(),write()返回和参数都是int!

No comments:

My photo
London, United Kingdom
twitter.com/zhengxin

Facebook & Twitter