`
darknight512
  • 浏览: 140363 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SCJP学习笔记之草稿篇

阅读更多
  • 子类继承服类的所有成员方法与变量,但不继承构造方法。在构造方法中用super(param ...)调用父类构造方法,如果不调用父类构造方法,默认调用父类无参数的构造函数,相当于super()。如果服类没有定义无参数的构造函数,又有其他的构造函数,就会造成编译错误。
  • 抽象类不能够实例化,其子类只有覆盖了所有的abstract方法才能实例化。
  • 接口中的变量默认都是public static的,而不用自己去特别申明
  • 抽象类可以部分实现接口中的方法,而接口则可以extends接口
  • 继承中如果重写方法,则默认使用基类中的方法,而基类中的方法只认基类的数据,如果要使用子类数据,就要重写方法
  • null参数即可满足Object,又可满足String,而重载是对原有方法的替换,且String是Object的子类,故会调用更具体,有针对性的method(String s)
  • 子类可自动转换为父类,打个比方:所有男人都是人,而父类要经过强制转换才能变为子类,就像人不一定都是男人
  • 对于函数,成员的访问权限,默认类型只有同包级成员可以访问,不可以跨包访问,而protect类型可以跨包访问,前提是有继承关系
  • 我们所说的is-a关系,是指一个类继承另一个类
  • 我们所说的has-a,一个类是另一个类的属性
  • 对于构造函数,其前面的访问修饰符只能是public,private或者protected
  • 同一个类中的constructor可以互相调用,使用this(....),但是this一定要在constructor的第一行,而且一个constructor不可以调用自身,不然会出现编译错误。super()也要写在第一行,故一个constructor中不能同时有this和super调用。
  • 在构造函数中可以用new创造新对象
  • static方法可以被重载为非static态方法
  • 重写的方法访问控制符不可以变宽,比如:public可以变为private,而反之不行
  • static方法如被重写,则只能重写为static方法
  • 重写方法抛出异常只能是被重写方法抛出异常的子类,或一样,或不抛出异常
  • 重写的方法只能访问其直接父类,而不能跨级访问
  • =是类的浅复制,改变的只是引用,而makeCopy是深复制,改变的是值
  • 实例方法不可以覆盖static方法,而静态字段隐藏则没有这种限制,静态方法如果满足覆盖的具体需求,则可以隐藏,否则会编译错误
  • 被隐藏的字段如果是static的,则可以用super引用来访问,也可以直接用超类名来访问
  • 利用引用对一个对象调用实例方法时,是该引用所代表当前对象的类决定将执行哪种方法实现,而不是引用的类型决定。
  • 在用引用访问对象字段时,是引用的类型,而不是引用所代表的当前对象的类决定了访问哪一个字段
  • 静态方法也由引用所隶属的类决定
内部类:
  • 方法体内的内部类只能在方法体内实例化,且生命周期也在方法体内
  • 内部类的文件名方式是"封装类$内部类.class",而匿名类则会由系统声称数字为类名
  • 非静态内部类其内部树型不应该声明为static
  • 方法体内部定义的类只能访问方法中final局部变量(为何,至今还有疑惑)
  • 方法体内部定义的类不可以有任何的访问修饰符,相当于局部变量。其也不可以用static修饰
  • 匿名内部类可以实现interface与extends,但是不可以同时使用
  • 匿名内部类不可以有构造函数
  • 匿名北部类默认是final的,不可以被abstract与static修饰
  • 如果一个类的默认无参数的constructor被设为private的,而其子类如要正常使用,这个类中一定要有重载的非private constructor,而且子类中要显式的对其调用
  • 内部类不可以与外部类同名
  • 与源文件同名的类其访问权限一定是public的

  • 如果类默认构造函数抛出一异常,子类的默认constructor应处理由父类抛出的异常(可以抛出相同,或范围更大的exception)
  • 类的初始化顺序中先初始化static对象,再是non-static
  • 非静态内部类是附属于类实例的,所以其内部属性不应该声明为static
  • 实例method不能重写为static method,但是可以被重载为static method,而类的属性则毫无限制
  • 父类中的某method如果为private,而子类中的同名method则完全是另一个method,而非重写!
  • this是当前创建对象的句柄,不能在静态方法中使用
  • 当类型后跟着[ ]记号时,声明中的所有变量均为数组,否则每个数组名后应加[],eg: int [ ] a,b;     int  a[ ], b[ ];
  • JAVA可以构造含0个元素的数组,但是要切记,数组是对象
  • 数组初始化时可以" , "结尾。eg: int a[ ]={1,2,}和int a[ ]={1,2}等价
  • 匿名数组的创建  eg: new int[ ] {3,4,5}
  • 非法的数组初始化   int[ ] a;  a={1,2,3}
  • length是数组最后一个元素的下标,为final 型,而非函数。所以数组大小为array.length非array.length()
  • return语句中的一个陷阱
           
java 代码
 
  1. if(true)  
  2.    return XX;  
  3. else  
  4.    return X;//这样可以编译通过  
  5.   
  6. //////////////////////////////////////////////////////////////////////  
  7.   
  8. if(true)  
  9.    return;//这样无法通过编译  
  10.   
  11. //而且  
  12.   
  13. if(true)  
  14.    return;  
  15. else if(!true)  
  16.    return;  
  17. //同样无法通过编译  
  18. //因为编译起能判断的方式只能是 if XXXXX;  else XXXXX;  

  • this引用是不可改变的
  • 包声明只能有一句,且出现在文件的第一句,如果没有包声明,则这个编译单元中所有对应的Byte Code将隶属于一个未命名包,此包一般等同于宿主当前工作目录
  • native在类中只规定了方法原型,可以按如下方式使用(只有method可以声明为native
    java 代码
    1. static{  
    2.    System.loadLibrary("someLib");  
    3.    native void nativeMethod();  
  • native原型还可以抛出异常
  • 如果lib没有装载成功,则会抛出UnsatisfiedLinkError
  • transient关键字用于对属性的声明,当对一个对象序列化时就不需要含有此字段的当前值,而无transient字段的属性,其值会作为序化对象状态的一部分,虽然static属性也可以加transient,但是多余的。因为static属性不属于对象的状态(属于类),且transient只能用于类变量。
  • volatile,编译好的源代码会将字段值优化到缓冲区,这会导致不可预见的错误,而用了volatile则不会优化,确保了并发访问的总是主字段内存中的当前值
  • 即使一个类中没有abstract方法,这个类仍然可以定义为abstact类
  • 静态方法中无隐含的对象引用this,当其中有实例化的对象,则可以访问此实例的非static成员
  • 只有方法与代码块才可以被声明为synchronized,而变量就不行
  • 源文件一定要遵循package, import, class的顺序
  • 如果引入的不同包中有类名相同,会有编译错误,除非在引用时写全路径
  • 注释可以出现在源文己的任何一行
  • 顶层类只可以用public修饰,static不能修饰顶层类
  • 标识符只能以字母,$,_开头
  • char属于整数型,但是无符号
  • Java中所有的参数都为传值传递,如参数为一个对象,则传递进的是该对象内存空间的引用。而引用类型是将引用拷贝给形参,所以方法中绝不可能改变原引用变量的引用,但却可以改变引用变量的属性
  • 两种等效的通知垃圾回收的机制:System.gc()与Runtime.getRuntime().gc(),此两种方法只能激活垃圾回收,但不能保证一定实施
  • main函数可以不用public修饰,这样可以通过编译,但是无法执行
  • 抽象类可以有构造函数,起用法是在子类中调用
  • 方法中的局部变量不可被声明为static,静态方法的调用是在编译时绑定的
  • 静态代码块只在首次装载时被执行一次(即首次声称实例)
  • 只要对象可以被任何存活线程访问,则不适合GC。而且一个已成为gc目标的对象,可以消除这种适合性。当对象的finalize()方法创建了一个指向该对象的可达引用时,就会消除适合性。
  • 所有类都从Object继承了一个protected void finalize() throws Throwable的方法,在gc调用此方法时,会忽略任何异常,然而在其他情况下调用finalize会处理异常,finalize可被重载,但只有原始签名的方法才会被gc调用
  • 数组的索引可以是 byte, int ,short
  • 访问修饰符与static一定要在返回类型之前eg : public void static是非法的
  • 返回值只要可隐式转换为所声明的返回类型,即是合法的。eg:当返回类型声明为int时,返回short也是可以的
  • 对象type(不是引用变量的type)决定了运行时使用哪个重写的方法,而引用类型决定在编译时使用哪个重载方法
  • 对具有interface返回类型的方法,可以返回该接口的任何实现
  • 对象array能存放其声明类型  instanceof测试的任何对象
  • 第一次class加载时会运行一次static块,当创建new instance时会运行实例的block,它们的运行都发生父constructor之后以及constructor代码运行之前

Generic(范型)
  • 范型的分类信息是用在编译期间来执行类型检查的,但是在运行时就被舍弃了。所以对于JVM而言:
  • java 代码
    1. List<String> st=new LinkedList<String>();  
    2. //在运行时会变为  
    3. List st=new LinkedList();  
    4. //分类信息会向后兼容,eg  
    5. List a=new ArrayList<Integer>();  
  • 在Generic中可以用"?"表通配,eg: List<?> list,但compiler会因为无法check以确保type-safe,所以List<?>会拒绝所有的add(),addAll()与set()所做的任何调用

Enumerated Type(枚举)
  • 所有的enumerated type都隐含的extend   java.lang.Enum,Enum中每个被声明的值是enum class自己的instance,这样保证了type safe,而且enum是不可以改变,不可以被subclass的
  • 对enum的改写:Enum实现了toString(),其会返回某值的名称,而valueOf()方法会返回XX.value,所以toString与valueOf要同时改变

  • Set除了在collection中定义的method外,并无其他扩展
  • 对于Wrapper,如其String参数不能被分析为合适的primitive,则会抛出NumberFormatException
  • 除了Character外,所有Wrapper类都提供两种constructor,一个是primitive,一个是String类型
  • valueOf方法   eg:   Integer it=Integer.valueOf("10101",2)注:后一个2是radix,基数
  • 一般而言,valueOf把String转为Wrapper类,而parseXXX把String转为primitive
  • Integer与long具有带基数的toString(String, radix)方法,以及转为任意技术显示的方法 toXXXString,eg:toHexString
  • 在Wrapper中有一个奇异的处理,为了节省内存,对下列包装器对象的两个instance,当它们基本值相同时,它们总是==的:Boolean, Byte, \u0000~\u007f的Character,-128~127的Integer
  • 在重载中,如果没有匹配的类型,参数被隐式加宽,且优先级必定是   加宽-》装箱-》var-arg,原则上是JAVA尽可能保证原有代码的健壮
  • 引用类型之间也可以加宽,但Wrapper间由于相互平等,故不存在加宽,可以先装箱,后加宽,但反之不行
  • Garbage Collection中的隔离一引用:有些对象间存在相互引用,但对它们的其他引用都被删除了,即任何活线程都无法访问这些对象,则gc会查找这样的对象岛,并删除它们。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics