JAVA类基础
1、成员变量默认赋初值;局部变量不默认赋值。基本类型成员变量赋初值,对象类型的成员变量赋初值null 所以Integer和int成员变量是不一样的。
2、一个java文件中可以定义多个类 但只准一个与java文件同名的public类 如下 将会编译成A.class B.class C.class
- public class A {}
- class B {}
- class C {}
内部类的情况 如下 将会编译成 A.class A$B.class
- public class A {
- class B {
- }
- }
匿名内部类的情况 将会编译成 A.class A$1.class
- public class A {
- void xxx() {
- button.addActionLisener(new ActionListener() {...});
- }
- }
3、函数里的局部参数(形参)是放在栈(stack)里的,当函数运行完毕之后,栈立即释放这些形参所占用的空间;
String abc = "kismet";内存里是这样分配的:abc 这个名字放在栈内存里,而字符串 kismet则是放在data segment里的,非堆内存。放在数据区的还有静态变量。
考虑下,为什么main方法是static的呢?因为运行main方法客观上要求不需new出新对象,就可以执行。所以只有用static方法了。
想一想System.out.println() 里面的out肯定是静态方法的。
4、权限分配:private 只在本类;default 被成为包权限,只要在一个包内,就可以访问;protected 包权限+子类(不管是否在一个包内) public 任何地方
5、toString()是Object的方法,默认是getClass().getName()+ hashCode()的。而hashCode可以理解为每个类都有的一个特殊编码,很多类的hashCode成了一个哈希表,用哈希表里的哈希码来快速寻找某个类的。
6、关于类的转型,Cat继承Animal Animal a = new Cat(); 向上转型。a既是Animal类,也是Cat类,所以 a 所能看到的,只是Animal和Cat的交集属性与方法,也就是说,如果Cat中的方法test() 在Animal中没有,则a.test()是不行的!只有将a 强制转成 Cat类之后,才可以调用Cat中所独有的方法的。
Cat b = (Cat) a; b.test() 就可以了。此为向下转型
7、抽象类和抽象方法:二者定义均需加abstract关键字,一个在class之前,一个在方法返回值之前。
所谓抽象类,里面必须包含抽象方法!(有没有别的实现方法和属性就不管了) 抽象类可以看成是残缺的类,因为他里面有不完整的抽象方法,所以抽象类不能new出实例,而是要用的话必须要被继承!而且继承的类里面必须实现这个残缺的抽象方法!如果你不想实现这个残缺的抽象方法,只想干点别的事,那么这个继承类可以继续定义成抽象类,直到有想实现抽象方法的继承类。
8、final 关键字,总之就是不可修改。定义final类,该类不可被继承,比如String Math Boolean等类。定义final方法,则该方法不可以重写;定义final成员变量,则该变量不可以被修改;定义final形参变量,则不允许在函数体中修改。
9、接口。接口本质上是一种特殊的抽象类。java是单继承类的,但是却是可以多继承接口的,接口就是为了弥补这个单继承类的缺点的。接口里的方法默认是public (stract)的,属性默认是public static final的。接口可以继续继承其他的接口。
枚举总结
1、枚举类是一种特殊形式的java类,每一个枚举值都是该枚举类的实例对象,枚举类的构造方法是必须是私有的;
2、枚举类也可以实现接口,继承抽象方法;
3、若枚举类只有一个值,则可以当成单例模式使用
4、JDK5扩展了switch中可以接受的值int char byte short,还可以接受枚举类型。jdk7可以接受string类型
泛型总结
定义泛型方法,将泛型放在函数返回值前面,如 public <T> void generic( T[] arr){}
两点注意:静态方法定义中不能使用类定义的泛型,而应该单独定义泛型;泛型只能用对象类型,而不能用实体类型,比如可以用Integer,而不能用int类型;泛型使用时候,必须一致,比如 List<Object> a = new ArrayList<String> 是不行的。
定义泛型类,在类后面加泛型,如 public class Generic <T>{} 然后类中定义的方法,用到泛型的时候,就不需要再将泛型放到返回值前面了。
泛型的上下边界问题,如:A(? extends String) 表示是String的子类 包括String; A(? super String) 表示是String的父类,包括String
用?表示泛型的时候,注意和类型相关的方法都不能用。比如list<?> 则 list.add()方法没法使用,因为其类型不确定。