1,静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?
- 静态内部类:使用static修饰的内部类
- 内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类,于是能访问外围类的所有成员,不需任何特殊条件
- 匿名内部类:使用new生成的内部类,例:
-
Runnable r =
new
Runnable() {
public
void
run() {
for
(
int
i =
1
; i <=
5
; i++) {
System.out.print(i +
" "
);
}
}
};
- 因为内部类的产生依赖于外部类,持有的引用是类名.this
- http://www.iteye.com/topic/442435
- 就是定义的这个类如果提供给两个或者两个以上的方法使用时就是用内部类、如果仅仅提供给一个方法使用时可以使用匿名内部类
2,抽象类和接口
abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法。
总结几句话来说:
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。
3,java数据类型
java基本数据类型就
8
种,记住就好了。除了这些都是引用型的了。
java四类八种基本数据类型
第一类:整型
byte
short
int
long
第二类:浮点型
float
double
第三类:逻辑型
boolean
(它只有两个值可取
true
false
)
第四类:字符型
char
基本类型 | 大小(字节) | 默认值 | 封装类 |
byte | 1 -128~127 | (byte)0 | Byte |
short | 2 | (short)0 | Short |
int | 4 | 0 | Integer |
long | 8 | 0L | Long |
float | 4 | 0.0f | Float |
double | 8 | 0.0d | Double |
boolean | - | false | Boolean |
char | 2 | \u0000(null) | Character |
java中默认的整数类型是
int
类型,如果要定义为
float
型,则要在数值后加上l或L;
默认的浮点型也是双精度浮点,如果要定义为
float
型,则要在数值后加上f或F。
基本数据类型自动转换
byte
->
short
,
char
->
int
->
long
float
->
double
int
->
float
long
->
double
记住:小可转大,大转小会失去精度!!!
"学java"占用 6个字节 6byte
float和double进行计算时不准确,可使用BigDecimal类来进行计算的时候,主要分为以下步骤:
1、用float或者double变量构建BigDecimal对象。
2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
3、把BigDecimal对象转换成float,double,int等类型。
1 BigDecimal b1 = new BigDecimal(Double.toString(0.48));
2 BigDecimal b2 = BigDecimal.valueOf(0.48);
对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。
1 public BigDecimal add(BigDecimal value); //加法
2 public BigDecimal subtract(BigDecimal value); //减法
3 public BigDecimal multiply(BigDecimal value); //乘法
4 public BigDecimal divide(BigDecimal value); //除法
java数据集合
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
Java常用集合类及其区别 http://blog.csdn.net/zhj870975587/article/details/50996811
集合集分为Collection和Map两大阵营,阵营里的这么多其实也分两种,一个线程安全,效率低。二线程不安全,效率高。因为android是单线程模型,适合使用线程不安全效率高的
java.util.Collection[接口]
--java.util.List[接口]
--java.util.AarrayList
--java.util.LinkedList
--java.util.Vector
--java.util.Stack
--java.util.Set[接口]
--java.util.HashSet
--java.util.SortedSet[接口]
--java.util.TreeSet
--java.util.Queue
java.util.Map[接口]
--java.util.SortedMap[接口]
--java.util.TreeMap
--java.util.HashMap
--java.util.HashTable
--java.util.LinkedHashMap
--java.util.WeakHashMap
对于快速访问数据,不经常有添加删除操作的时候选择数组实现,而对于经常添加删除数据,对于访问没有很高要求的时候选择链表。
4,&和&&认知
& 既是位运算符又是逻辑运算符,&的两侧可以是int,当boolean表达式,当&两侧是int时,要先把运算符两侧的数转化为二进制数再进行运算,&&的两侧要求必须是布尔表达式,短路&&当前面是false不再执行后面的但&前面为false继续执行后面的表达式。
,短路&&当前面是false不再执行后面的但&前面为false继续执行后面的表达式。
<span style="color:#333333">|与||的区别,||也是短路,前面表达式true时不再执行下面的,|都执行结束才输出结果</span>
5,重写、覆盖、重载、多态几个概念的区别分析http://blog.sina.com.cn/s/blog_8dee2c110102xcb7.html
6,java复合式 i++,++i
a=++i;(分解:i=i+1;a=i;) a的值是1
7,泛型<T>
泛型 Android使用泛型的地方很多,比如集成自BaseAdapter实现封装的Adapter,对常用操作进行封装,Json解析,但是需要对传进来的数据进行处理,此时就使用到泛型,避免强转错误,泛型可以消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。通配符作用
8,对封装、继承、多态、抽象的理解
封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或者不该告诉别人的东西隐藏起来,把可以告诉别人的公开,别人只能用我提供的功能实现需求,而不知道是如何实现的。增加安全性
继承:是面向对象最显著的一个特性,继承是从已有的类中派生出新的类称为子类,子类继承父类的数据属性和行为,并能根据自己的需求扩展出新的行为,提高了代码的复用性。
多态:指允许不同的对象对同一消息做出相应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。封装和继承几乎都是为多态而准备的,在执行期间判断引用对象的实际类型,根据其实际的类型调用其相应的方法。
抽象:表示对问题领域进行分析、设计中得出的抽象的概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,在java中抽象用 abstract 关键字来修饰,用 abstract 修饰类时,此类就不能被实例化,从这里可以看出,抽象类就是为了继承而存在的,如果定义了一个抽象类而不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情,用 abstract 修饰方法时,此方法就是抽象方法,抽象方法必须存在于抽象类中,抽象方法没有方法体,对于一个父类来说,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为抽象方法,抽象方法的修饰符必须为 public 或者 protected ,应为用 private,则不能被子类继承,子类便无法实现该方法,缺省情况下默认为 public 。
9,枚举
当我们在需要控制一个方法传入的参数的时候,并且这些参数可以自己处理一些事情的时候我们就可以选择枚举来实现。例如:时间选择格式,我们可以用枚举来规定格式,然后外界只能调用枚举中的格式,然后枚举再去将规定的格式传给时间用于格式化。 所有的逻辑处理交给枚举来完成,我们只需要调用相应的枚举类型就能得到想要的时间格式的时间。 还有很多地方都体现出枚举的好处,例如:网络请求的接口定义;一些辑返回参数的定义;只要是需要控制变量的数量或者范围,并且拿到变量后还需要处理一些逻辑的场景都可以用枚举来完成。
getData(TYPE type);public enum TYPE { red, RED, green, yellow, blue; }
10,java的反射机制
反射机制的应用场景:
- 逆向代码 ,例如反编译
- 与注解相结合的框架 例如Retrofit
- 单纯的反射机制应用框架 例如EventBus 2.x
- 动态生成类框架 例如Gson
程序运行的结果是:_____good and gbc__________。
public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
Sytem.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}