java复习笔记(一)

1. 数组也是引用类型的,分为栈内存,堆内存。
2. 类Field最好就直接用类去调用,别用对象去调用,分清了好。
3. 引用型数据结构,当定义的时候在栈内存中生成一个引用型变量(不同的函数有它自己的栈区),它指向函数运行时候的堆内存中相应的对象,(所以,若String str1 = “test”;String str2 = "test";str1 == str2 输出的是“false”)但是Integer有例外,当在-128-127之间的时候,比如说Integer int1=2;Integer int2=2,int1==int2,返回的是“true”,这只不过和java的Integer形成的机制有关,大于127,或者小于-128也是普通的。
4. 类的static Field在第一次加载类的时候就初始化好的。
5. import static载入某一类的所有静态方面,静态Field
6. 无参构造器还是重要的,一般自己写构造器后自己要手动添加一个无参的构造器。
7. 类中自己调用构造器是通过this。(this(“ag”,8);)。
8. 构造器在执行的时候是一直往上找它的父亲,从最顶层的父亲的构造函数开始执行,最后到自己,也就是说每次new一个类,Object的构造器都会执行一次(默认执行的无参的构造器)。
9. this,和super都不能出现在static修饰的方法中,static修饰的东西属于类不属于对象。
10. BaseClass p = new SubClass();p这个引用变量,它编译时类型是BaseClass,而运行时类型是SubClass,它能调用的还是BassClass中的方法,不能调用SubClass类中的方法。
11. 当创建一个子类的时候,系统不仅仅需要为该子类定义Field分配内存空间,而且需要为它的父类所定义的Field分配内存空间。
12. 在创建一个java对象的时候,不仅会执行该类的普通初始化块和构造函数,而且系统会一直上溯到Object类,先执行Object的初始化块,开始执行Object构造函数,依次向下执行、、、、、、。
13. ==:只要两个变量时基本类型变量,且都是数值类型(不一定要求数据类型严格相同,也就是说假如把char和int比较就是在用char的ASC码在和int的数值在比较),则返回true;对于两个引用型变量,必须它们同时指向同一个对象时候才是true。
14. 常量池专门用于管理在编译期别确定保存并被保存在已编译的.class文件中的一些数据,它还包括关于类,方法,接口中的常量,还包括字符串常量。example:String str1 = “testtet2”;String str2 = "tet2";String str3 = "test"+"tet2";String str4 ="test";String str5 = str4 + str2;这里str1,str2,str3,str4都可以在编译期都可以定下来,并且str1==str3,输出是“true”,str5不是的,str5==str1,输出“false”,关于equals()方法,这里str5.equals(str1),输出的是“true”,其实equals()它实际的意义也是表示变量指向同一个对象才返回“true”,这里之所以返回“true”是因为String的equals()方法已经重写过了,只要值相等就相等,是重写后的结果。所以可以自己重写equals()方法来表示自己对于两个对象相等的标准。例子:public boolean equals(Object object){
if(this == object){
return true;
}
if(object != null && object.getClass() == XXXX.class){
XXXXXXXXXXXXXXXXXXX;
}
return false;
}
而对于列子为何直接用object.getClass() == XXXXX.class,来确定对象到底属于哪一个类,而不是用object Instanceof XXXX,这是因为加入object是XXXX的子类也是返回“true”,这样就不能精确的表示是否属于哪一个类,例子中的判断写的绝对,更加精确。
15. BaseClass tset = null;tset.test();加入test()是static方法,语句没有问题的。
16. 可执行“宏替换”的final变量,String str1 = "testxixi";final String str2="test";final String str3="xixi";String str4=str2+str3;这里str1 == str4,输出的是“true”,也就是说加入是final变量,在编译期String str4 = str2 + str3相当于String str4 = "test" + "xixi",即宏替换。
17. 在某种情况下,父类知道自己的子类应该包含什么样的方法,但是无法准确的知道具体如何实现这些方法,抽象类。
18. 接口中的变量就是public static final,方法是public abstract,都是默认,或者默认添齐的。不可以用static去描述其中的方法。
19. 接口与抽象类:
都不能实例化,被其他类实现和继承,都可以包含抽象方法。
区别:
接口作为系统与外界交互的窗口,接口体现的是一种规范。对于接口实现者而言,接口规定了实现者必须向外提供哪些服务(以方法的形式提供),对于接口的调用者而言,接口规定了调用者可以调用哪些服务(就是如何来调用方法)。当在一个程序中使用接口时,接口是多个模块间的耦合标准,当在多个应用程序之间使用接口时候,接口是多个程序直接通信的标准。某种程度上来说接口类型与整个系统的“总纲”,它制定了系统各模块应该遵循的标准,因此一个系统中的接口本不应该经常变化。一旦接口被改变,对整个系统影响是辐射型的。
抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计。抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,整个中间产品已经实现了系统部分功能(那些已经提供实现的方法),但这个产品依然不能当做最终产品。必须有更进一步的完善。
区别还有:
抽象类中处理抽象方法还可有普通方法,和静态方法,和普通Field,构造器(给其子类调用),初始化块,
一个类可以实现多个接口,弥补了单继承的不足。
20. 简单工厂模式,即在不确定到底该调用哪一种对象时候,让这些对象都去实现一个接口,这个接口相当于一个中间产物(即工厂),有工厂去确定到底产生哪一个具体对象,它返回的就是一个对象,这样做目的是为了减轻后期假如代码要修改带来的麻烦。另外加入正的有这种并行的方法选择这样结构更加清晰,代码更加优雅。

你可能感兴趣的:(java)