1、我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。- 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明
2、的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。2、访问
3、修饰符public,private,protected,以及不写(默认)时的区别?修饰符当前类同 包子 类其他包publicprotecteddefaultprivate类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。3、String 是最基本的数据类型吗?不是。Java中的基本数据类型只有8个:byte
4、、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type),Java 5以后引入的枚举类型也算是一种比较特殊的引用类型。4、float f=3.4;是否正确?答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。5、short s1 = 1; s1 = s1 + 1;有错吗?shor
5、t s1 = 1; s1 += 1;有错吗?对于short s1 = 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。6、Java有没有goto?goto 是Java中的保留字,在目前版本的Java中没有使用。(根据James Gosling(Java之父)编写的The Java Programming Language一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使
6、用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)7、int和Integer有什么区别?Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。Java 为每个原始类型提供了包装类型:- 原始类型: boolean,char
7、,byte,short,int,long,float,double- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Doubleclass AutoUnboxingTest public static void main(String args) Integer a = new Integer(3); Integer b = 3; / 将3自动装箱成Integer类型 int c = 3; System.out.println(a = b); / false 两个引用没有引用同一对象System.out.println(a = c);
8、 / true a自动拆箱成int类型再和c比较 12345678910最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码如下所示:public class Test03 public static void main(String args) Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; System.out.println(f1 = f2); System.out.println(f3 = f4); 如果不明就里很容易认为两个输出要么都是true要么都是false。首先需要注意的是f1、f2、f3、f4四个变量都是Integer对象
9、引用,所以下面的=运算比较的不是值而是引用。装箱的本质是什么呢?当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,如果看看valueOf的源代码就知道发生了什么。 public static Integer valueOf(int i) if (i = IntegerCache.low & i = IntegerCache.high) return IntegerCache.cachei + (-IntegerCache.low); return new Integer(i); IntegerCache是Integer的内部类,其代码如下所示:
10、/* * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the code -XX:AutoBoxCacheMax= option. * During VM initialization, java.lang.In
11、teger.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ private static class IntegerCache static final int low = -128; static final int high; static final Integer cache; static / high value may be configured by property int h = 127; Str
12、ing integerCacheHighPropValue = sun.misc.VM.getSavedProperty(java.lang.Integer.IntegerCache.high); if (integerCacheHighPropValue != null) try int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); / Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1); catch( NumberFormatException nfe) / If the property cannot be parsed into an int, ignore it. high = h; cache = new Integer(high - low) + 1; int j = low; for(int k = 0; k = 127; private IntegerCache() 11121314151617181920212223242526272829303132333435363738394041424344
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1