Java基础部分

来源:互联网 发布:ubuntu打开输入法 编辑:程序博客网 时间:2024/06/16 14:33

Java基础部分

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法。

Java有没有goto?

java中的保留字,现在没有在java中使用。

说说&和&&的区别。

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

在JAVA中如何跳出当前的多重嵌套循环?

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如,
ok:

    for(int i=0;i<10;i++)   {        for(int j=0;j<10;j++)       {            System.out.println(“i=” + i + “,j=” + j);            if(j == 5) break ok;        }    } 

另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

int arr[][] = {{1,2,3},{4,5,6,7},{9}};boolean found = false;for(int i=0;i<arr.length && !found;i++) {        for(int j=0;j<arr[i].length;j++){            System.out.println(“i=” + i + “,j=” + j);            if(arr[i][j]  == 5) {                found = true;                break;            }        }} 

switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
这是jdk1.7之前的所说的switch语句不能用在String, 但是* jdk1.7 之后可以使用String!!!! *

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

char型变量中能不能存贮一个中文汉字?为什么?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。

用最有效率的方法算出2乘以8等於几?

2 << 3,
因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。

请设计一个一百亿的计算器

首先要明白这道题目的考查点是什么,一是大家首先要对计算机原理的底层细节要清楚、要知道加减法的位运算原理和知道计算机中的算术运算会发生越界的情况,二是要具备一定的面向对象的设计思想。
首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围的,为了便于讲解和理解,我们先以byte 类型的整数为例,它用1个字节进行存储,表示的最大数值范围为-128到+127。-1在内存中对应的二进制数据为11111111,如果两个-1相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,11111110,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为11111110,也就是-2,这正好利用溢位的方式实现了负数的运算。-128在内存中对应的二进制数据为10000000,如果两个-128相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,00000000,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为00000000,也就是0,这样的结果显然不是我们期望的,这说明计算机中的算术运算是会发生越界情况的,两个数值的运算结果不能超过计算机中的该类型的数值范围。由于Java中涉及表达式运算时的类型自动提升,我们无法用byte类型来做演示这种问题和现象的实验,大家可以用下面一个使用整数做实验的例子程序体验一下:

        int a = Integer.MAX_VALUE;        int b = Integer.MAX_VALUE;        int sum = a + b;        System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);

先不考虑long类型,由于int的正数范围为2的31次方,表示的最大数值约等于2*1000*1000*1000,也就是20亿的大小,所以,要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:
()这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数
()有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中
()提供加减乘除的功能

public class BigInteger{        int sign;        byte[] val;        public Biginteger(String val)   {            sign = ;            val = ;        }        public BigInteger add(BigInteger other) {        }        public BigInteger subtract(BigInteger other)    {        }        public BigInteger multiply(BigInteger other){        }        public BigInteger divide(BigInteger other){        }}

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer(“immutable”);
执行如下语句将报告编译期错误:
a=new StringBuffer(“”);
但是,执行如下语句则可以通过编译:
a.append(” broken!”);

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final  StringBuffer  param){} 

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append("a");

静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。

public class VariantTest{        public static int staticVar = 0;         public int instanceVar = 0;         public VariantTest(){            staticVar++;            instanceVar++;            System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);        }}

是否可以从一个static方法内部发出对非static方法的调用?

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。

Integer与int的区别

int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12;Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.round(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

什么是构造函数

构造函数是一种特殊的函数,用来在对象实例化对象的成员变量。有如下特点:
1构造函数必须与类的名字相同,并且不能有返回值(返回值也不能为void)。
2每个类可以有多个构造函数。
3构造函数可以有0,1,或1个以上的参数。
4构造函数总是伴随着new操作一起调用,且不能由程序的编写者直接调用,必须要由系统调用。构造函数在对象实例化时被自动调用,且只运行一次;而普通的方法则是在程序执行到他时才被调用,且可以被对象多次调用。
5构造函数的主要作用是完成对象的初始化工作。
6构造函数不能被继承,因此不能被覆盖,但是可以重载,可以使用不同的参数个数或参数类型来定义多个构造函数。
7子类可以通过super关键字来显示的调用父类的构造函数
8当父类和子类都没有定义构造函数时,编译器会为父类生成一个默认的无参数的函数,给子类也生成一个默认的无参数的构造函数。

为什么java中有些接口没有任何方法

由于java不支持多重继承,为了克服单继承的缺点,引入了接口,接口是抽象方法定义的集合,是一种特殊的抽象类。在java语言中,有些接口没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明额接口又被叫做标志接口,标志接口对实现它的类没有任何语义上的要求,仅仅当一个标志的作用,用来表明实现它的类属于一个特定类型。

什么是反射机制

反射机制是JAVA语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部的成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当的使用反射机制,也会严重影响系统的性能。
具体而言,反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法。其中还有一个非常重要的一个作用就是可以在运行时动态地创建类的对象,例如:

Class Base{        Public void f(){        System.out.println(“Base”);        }        }        Class Sub extends Base{        publci void f(){        System.out.println("Sub");        }        }        Public class Test{       Public static void main(String[] args){        Try{            Class c=Class.forName("Sub");            Base b=(Base)c.newInstance();            b.f();        }        Catch(Exception)        {            e.printStatckTrace();        }    }}

运行结果为:Sub。

Package有什么作用

中文意思是包,宗旨是把.java文件,.class文件,以及其他resource文件有条理的进行一个组织以供使用。,主要有两个作用:第一提供多层命名空间,解决命名冲突。第二对类按功能进行分类。

如何实现类似于C语言中函数指针的功能

C语言中的函数指针最重要的功能是实现回调函数,函数指针一般作为函数的参数来使用,开发人员使用时可以根据自己的需求传递自定义的函数来实现指定的功能,可以利用接口与类来实现相同的效果。具体而言就是先定义一个接口,然后在接口中声明要调用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数的功能。

JAVA语言有哪些优点

1Java为纯面向对象的语言。
2平台无关性。JAVA语言可以“一次编译,到处运行”。
3java提供了很多内置的类库。,简化了开发人员的程序设计工作,同时缩短了项目的开发时间。
4提供了对WEb应用开发的支持。
5具有较好的安全性和健壮性。
6去除了C++语言中难以理解,容易混淆的特性。

请说出作用域public,private,protected以及不写时的区别

这四个作用域的可见范围如下表所示。
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×

Java程序初始化的顺序是怎样的

在JAVA语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
初始化一般遵循3个原则(优先级依次递减):
1静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象(变量)只初始化一次。而非静态对象(变量)可能会初始化多次
2父类优先子类进行初始化
3按照成员变量定义顺序进行初始化,即变量定义散布于定义方法之中,它们依然在任何方法(包括构造方法)被调用之前先初始化。
Java程序初始化工作可以在许多不同的代码块中来完成,它们执行的顺序如下:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数。

0 0
原创粉丝点击