JAVA中的几种基本类型
作用域public,private,protected,以及不写时的区别
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。
Java面向对象的特征是什么?
特征:继承、封装、多态、抽象
继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。
抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。
组合(Composition)、聚合(Aggregation)区别:
组合和聚合是有很大区别的,这个区别不是在形式上,而是在本质上:
比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象也同时消亡(没有任何一个引用指向它,成了垃圾对象),这种情况叫做组合,
反之b所指向的对象还会有另外的引用指向它,这种情况叫聚合
int与Integer的区别,Integer的值缓存范围
基本对比:
(1)Integer是int的包装类;int是基本数据类型;
(2)Integer变量必须实例化后才能使用;int变量不需要;
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
(4)Integer的默认值是null;int的默认值是0。
深入对比:
(1)由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
(2)Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)。
(3)非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
(4)对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false。原因:java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。
public static void main(String[] args) {
Integer i=new Integer(100);
Integer s=new Integer(100);
int i1=100;
Integer s1=100;
Integer j =100;
System.out.println(s1 == j);//运行结果true
Integer i2 =128;
Integer j2 =128;
System.out.println(i2 == j2);//运行结果false
System.out.println(i==s);//运行结果false
System.out.println(i==i1);//运行结果true
System.out.println(s==s1);//运行结果false
}
总之Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从JDK 1.5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。小编推荐一个学java的学习裙【五五七,八六五,】,【验证:烟火】无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!每天晚上8点还会直播讲课,大家可以一起互动学习,一起进步。
...
final, finally, finalize 的区别
(1)final修饰符(关键字)如果一个类被申明为final,意味着它不能再派生出新的子类,不能作为父类被继承,因此一个类不能既被声明为abstract的,又被声明为final的。将变量和方法声明为final变量的,可以保证它们在使用中不被改变。被声明为final的变量必须在申明时给定初值,而在以后的引用中只能读取不可以被修改。被申明为final的方法也同样只能使用不能重载。
(2)finally在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。
(3)finalize方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做好必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用的情况下对这个对象的调用。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象的调用。
&和&&、|和||的区别?
(1) 与操作:与操作分为两种,一种是普通与,另外一种是短路与,一样的地方就是二者执行最后的结果是一样的,但是执行的过程有区别:
普通与(&):表示所有的判断条件都要执行,不管前面是否满足;
短路与(&&):如果前面的条件已经是false了,那么后面的条件不需要再进行任何的判断;
(2)同理,或操作:或操作分为两种,一种是普通或,另外一种是短路或:
普通或(|):表示所有的判断条件都要执行,不管前面是否满足;
短路或(||):如果前面的条件已经是true了,那么后面无论如何判断都是true,就不判断了;
在开发之中考虑到程序的性能肯定使用短路与(&&)和短路或(||),执行效率更高。