(1)Integer是int的包装类;int是基本数据类型;
(2)Integer变量必须实例化后才能使用;int变量不需要;
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
(4)Integer的默认值是null;int的默认值是0。
在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型。(一个字节等于8个bit)
1.整型
类型 存储需求 bit数 取值范围 备注
int 4字节 4*8
short 2字节 2*8 -32768~32767
long 8字节 8*8
byte 1字节 1*8 -128~127
2.浮点型
类型 存储需求 bit数 取值范围 备注
float 4字节 4*8 float类型的数值有一个后缀F(例如:3.14F)
double 8字节 8*8 没有后缀F的浮点数值(如3.14)默认为double类型
3.char类型
类型 存储需求 bit数 取值范围 备注
char 2字节 2*8
4.boolean类型
类型 存储需求 bit数 取值范围 备注
boolean 1字节 1*8 false、true
下面是多态存在的三个必要条件,要求大家做梦时都能背出来!
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。
多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
例子:
void doSomething(Shape shape){
shape.draw();
.
.
shape.erase();
}Circle circle = new Cricle();
Traingle traingle = new Traingle();
Line line = new Line();
doSonething(circle);
doSonething(traingle);
doSonething(line);
当Cricle被传入到Shape时,Cricle 会被doSomething()看做是Shape,也就是说doSomething发送给Shape的任何消息,都会被Circle接受到,这样就是合乎逻辑的。在此过程中用到了向上转型(upcasting).
java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。
1.可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
char[] value;
2.是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:
1 public synchronized StringBuffer reverse() {
2 super.reverse();
3 return this;
4 }
5
6 public int indexOf(String str) {
7 return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法
8 }
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
3.StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
内部类 ( inner class ) : 定义在另一个类中的类
我们为什么需要内部类?或者说内部类为啥要存在?其主要原因有如下几点:
1、 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。
2、 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。
3、抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。
抽象类和接口是java语言中两种不同的抽象概念,他们的存在对多态提供了非常好的支持,虽然他们之间存在很大的相似性。但是对于他们的选择往往反应了您对问题域的理解。只有对问题域的本质有良好的理解,才能做出正确、合理的设计。
1,为子类提供一个公共的类型;
2,封装子类中重复内容(成员变量和方法);
3,定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。
抽象类表示共有许要实现的方法 接口用来特定类有需要才实现 人都会吃饭 但有的人抽烟
抽象类是用来捕捉子类的通用特性的
抽象类是 is a关系;而接口是has a关系
看看jdk的api会发现大部分接口都是able结尾的,表示一种能力。马士兵曰过:当你不知道用抽象类还是接口好时就用接口
extends 可用于返回类型限定,不能用于参数类型限定。
super 可用于参数类型限定,不能用于返回类型限定。
>带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。
不能,
因为静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说。(最后一句话是自己理解,不知道说的对不对,欢迎大家批评指正)
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
final 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
finally 是异常处理语句结构的一部分,表示总是执行.
finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用.
简单地说,“序列化”就是将运行时的对象状态转换成二进制,然后保存到流、内存或者通过网络传输给其他端。
Serializable 有以下几个特点:
实现了 Parcelable 接口的类在序列化和反序列化时会被转换为 Parcel
类型的数据
父类的静态属性和方法可以被子类继承,但不能被重写,
原因
static修饰函数/变量时,其实是全局函数/变量,它只是因为java强调对象的要
挂,它与任何类都没有关系。靠这个类的好处就是这个类的成员函数调用static方法不用带类名。
注意:static关键字可以用修饰代码块.static代码块可以置于类中的任何一个位置,并可以有多个static代码块。在类初次被加载时,会按照静态代码块的顺序来执行,并且只会执行一次。
方法中的局部变量会在执行结束后就会被释放,但是内部类访问此变量就形成了闭包
内部类使用外部的局部变量,实际上形成了闭包,也就是捕获了所在方法内的变量,这个被捕获的变量不能随着方法的执行完毕而消失,因为内部类的实例可能还会用到这个变量,所以需要 final 关键字来让这个变量不消失(final 修饰的变量会转为常量,因此不会随着方法的执行完毕而消失)。
如果在内部类中使用到了外部方法的变量,需要使用 final 修饰,否则无法编译通过,但如果使用的是 JDK8,那么即便你不加final 修饰,也是可以编译过的,因为编译器替你加上了。
integer.parseInt(string str)方法调用Integer内部的
parseInt(string str,10)方法,默认基数为10,parseInt内部首先
判断字符串是否包含符号(-或者+),则对相应的negative和limit进行
赋值,然后再循环字符串,对单个char进行数值计算Character.digit(char ch, int radix)
在这个方法中,函数肯定进入到0-9字符的判断(相对于string转换到int),
否则会抛出异常,数字就是如上面进行拼接然后生成的int类型数值。
继承是类的关系,单继承,实现是类和接口之间的关系,多实现
单继承有局限性,多实现避免了单继承的局限性
继承后,普通的方法可以直接使用,实现后,方法全重写(因为方法全抽象)
抽象类中可以有方法,抽象方法,构造方法
接口中,全部是抽象方法
子类继承抽象类,重写抽象方法,建立子类对象
接口实现类,实现接口,重写全部抽象方法,建立实现类的对象
抽象类有普通方法,子类集成后,可以直接使用
接口全抽象,实现类之后,全重写
抽象类是单继承
接口是多实现,接口之间多实现
抽象类是继承体系的共性内容,is...a 关系
接口是继承体系中的额外功能,扩展功能,和继承体系之间的关系是 like....a 关系
此上内容是经过资料查询和自己理解,加工总结而成,仅供参考(不喜勿喷)