几道Java笔试题
1.寫出程序運行結果
public class TestString {
????public static void link(String a){
???????? a+="World";
????}
????public static void main(String []args){
??????? ?String a = "Hello";
??????? ?link(a);
???????? System.out.println(a);
????}
}
答: 這道題考兩個方面: 1). String對象的內容是不能改變的,a+="World"并不是把a所指對象改變, 而是先生成一個臨時String對象,其值為a+"World",然后在把這個臨時 對象賦給a. 2). Java中函數參數傳遞方式為Call by value,link方法中會生產a的一個 拷貝,同樣指向a所指的對象,綜合以上兩點,得出結果為 Hello ? 2. 寫出下面代碼的結果 ? System.out.println("ja"+"va"?==?"java"); 答:"=="用來比較對象的引用,而equals()用來比較對象的內容,但是如果是字符串常量,用"=="也可以比較內容 是否相等,"ja"+"va"和"java"都是字符串常量,因此結果為true 同理,下面代碼結果也是true final?String?str?=?"java";
System.out.println(str=="java")
? 3.繼承時候類的執行順序問題,一般都是選擇題,問你將會打印出什么? public class Parent {
????//1
????static int a = 1;
????//2
????static??
????{
????? ?a=10;
????? ?System.out.println("parent static code");
????}
????//4
????public Parent(){
???? ?System.out.println("Parent constructor");
??? ??System.out.println("Parent a ="+a);
????}
????public static void main(String []args){
???? ?System.out.println("*****************");
???? ?Parent c = new Child();
????}??
}
public class Child extends Parent{
??
????static int a = 2;
????//3
????static {
????? a=20;
????? System.out.println("child static code");
????}
????public Child(){
????? System.out.println("Child constructor");
???? ?System.out.println("Child var a="+a);
????}
}
輸出結果: parent static code
*****************
child static code
Parent constructor
Parent a =10
Child constructor
Child var a=20
由此可看出在還沒有實例化類的時候(注意*號)已經執行了static代碼塊。順序是先父類后子類.然后才調用父類的構造方法,再調用子類的構造方法.就是這個順序了.
4.內部類的實現方式:
public class OuterClass {
????static int a;
????int b;
????private class InnerClass{
???? public InnerClass(){
??????System.out.println("InnerClass create:"+a);
??? ?}?
??}
????public OuterClass(){
?????? InnerClass ic = new InnerClass();
?????? System.out.println("OuterClass create");
????}
????public static void main(String []args){
??????? OuterClass oc = new OuterClass();
????}
} 總結:
一.靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。
二.靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;
三.非靜態內部類的非靜態成員可以訪問外部類的非靜態變量 5. Float類型 public class TestFloat {
??
????public static void main(String []args){
????Float a = new Float(3.4);
????System.out.println(a.SIZE);
????a = new Float(34000);
????System.out.println(a.SIZE);
????}
} 讓我們來看看此程序會輸出什么呢?
我們先來看看JDK的解釋吧.
public?static?final?int?SIZE
The?number?of?bits?used?to?represent?a?float?value.?
意思是說:通常去描述一個float值的位數.這個是一個常量,來看看源碼吧:?public?static?final?int?SIZE?=?32; final int 變量一旦被定義就不能被改變~ ? 第二個Float類型題: public?class?Test2
{
????public?static?void?main(String[]?args)
????{
????????float?a?=?3.4;
????}
}
這個簡單的程序能不能編譯通過呢?
其實是不能的。
原因是精度問題,應該用強制類型轉換.
float?a?=?(float)3.4;
再來看看這個能不能編譯通過
public?class?Test2
{
????public?static?void?main(String[]?args)
????{
????????Float?a?=?new?Float(3.4);
????????
????}
}其實是沒問題的。
我們來看看Float類的源代碼吧:
??public?Float(double?value)?{
????this.value?=?(float)value;
????}
其中有一個構造方法在方法里已經進行了向下轉型。
所以這樣寫是沒有問題的. 6.選出用法錯誤的:
a:?Stirng?a?="Gone?With?Wind";?
String?t=?"Wind";?
String?m;?
m=a-t;?
B:?Stirng?a?="Gone?With?Wind";?
String?m?;?
m=a[3]+"one";?
C:?Stirng?a?="Gone?With?Wind";?
Sting?m;?
m=a.toUpperCase();?
D:?不記得了?
7.此程序會輸出什么? public class A {
?? //3
????public A(){
?????? a1();
????}
????public void a1(){
????? System.out.println("A-a1");
????}
}
public class B extends A{
????int bb = 0;
????//2
????public B(){
????//5
??bb=1000;
????}
????//4
????public void a1(){
??System.out.println("bb is"+bb);
??System.out.println("B-a1");
????}
????public static void main(String []args){
??new B();
????}
}
答案:
bb is 0
B-a1
看看執行順序就明白了.
在方法被a1()被重寫的情況下,父類的a1是沒有機會
被調用的. ?
public class TestString {
????public static void link(String a){
???????? a+="World";
????}
????public static void main(String []args){
??????? ?String a = "Hello";
??????? ?link(a);
???????? System.out.println(a);
????}
}
答: 這道題考兩個方面: 1). String對象的內容是不能改變的,a+="World"并不是把a所指對象改變, 而是先生成一個臨時String對象,其值為a+"World",然后在把這個臨時 對象賦給a. 2). Java中函數參數傳遞方式為Call by value,link方法中會生產a的一個 拷貝,同樣指向a所指的對象,綜合以上兩點,得出結果為 Hello ? 2. 寫出下面代碼的結果 ? System.out.println("ja"+"va"?==?"java"); 答:"=="用來比較對象的引用,而equals()用來比較對象的內容,但是如果是字符串常量,用"=="也可以比較內容 是否相等,"ja"+"va"和"java"都是字符串常量,因此結果為true 同理,下面代碼結果也是true final?String?str?=?"java";
System.out.println(str=="java")
? 3.繼承時候類的執行順序問題,一般都是選擇題,問你將會打印出什么? public class Parent {
????//1
????static int a = 1;
????//2
????static??
????{
????? ?a=10;
????? ?System.out.println("parent static code");
????}
????//4
????public Parent(){
???? ?System.out.println("Parent constructor");
??? ??System.out.println("Parent a ="+a);
????}
????public static void main(String []args){
???? ?System.out.println("*****************");
???? ?Parent c = new Child();
????}??
}
public class Child extends Parent{
??
????static int a = 2;
????//3
????static {
????? a=20;
????? System.out.println("child static code");
????}
????public Child(){
????? System.out.println("Child constructor");
???? ?System.out.println("Child var a="+a);
????}
}
輸出結果: parent static code
*****************
child static code
Parent constructor
Parent a =10
Child constructor
Child var a=20
由此可看出在還沒有實例化類的時候(注意*號)已經執行了static代碼塊。順序是先父類后子類.然后才調用父類的構造方法,再調用子類的構造方法.就是這個順序了.
4.內部類的實現方式:
public class OuterClass {
????static int a;
????int b;
????private class InnerClass{
???? public InnerClass(){
??????System.out.println("InnerClass create:"+a);
??? ?}?
??}
????public OuterClass(){
?????? InnerClass ic = new InnerClass();
?????? System.out.println("OuterClass create");
????}
????public static void main(String []args){
??????? OuterClass oc = new OuterClass();
????}
} 總結:
一.靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。
二.靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;
三.非靜態內部類的非靜態成員可以訪問外部類的非靜態變量 5. Float類型 public class TestFloat {
??
????public static void main(String []args){
????Float a = new Float(3.4);
????System.out.println(a.SIZE);
????a = new Float(34000);
????System.out.println(a.SIZE);
????}
} 讓我們來看看此程序會輸出什么呢?
我們先來看看JDK的解釋吧.
public?static?final?int?SIZE
The?number?of?bits?used?to?represent?a?float?value.?
意思是說:通常去描述一個float值的位數.這個是一個常量,來看看源碼吧:?public?static?final?int?SIZE?=?32; final int 變量一旦被定義就不能被改變~ ? 第二個Float類型題: public?class?Test2
{
????public?static?void?main(String[]?args)
????{
????????float?a?=?3.4;
????}
}
這個簡單的程序能不能編譯通過呢?
其實是不能的。
原因是精度問題,應該用強制類型轉換.
float?a?=?(float)3.4;
再來看看這個能不能編譯通過
public?class?Test2
{
????public?static?void?main(String[]?args)
????{
????????Float?a?=?new?Float(3.4);
????????
????}
}其實是沒問題的。
我們來看看Float類的源代碼吧:
??public?Float(double?value)?{
????this.value?=?(float)value;
????}
其中有一個構造方法在方法里已經進行了向下轉型。
所以這樣寫是沒有問題的. 6.選出用法錯誤的:
a:?Stirng?a?="Gone?With?Wind";?
String?t=?"Wind";?
String?m;?
m=a-t;?
B:?Stirng?a?="Gone?With?Wind";?
String?m?;?
m=a[3]+"one";?
C:?Stirng?a?="Gone?With?Wind";?
Sting?m;?
m=a.toUpperCase();?
D:?不記得了?
7.此程序會輸出什么? public class A {
?? //3
????public A(){
?????? a1();
????}
????public void a1(){
????? System.out.println("A-a1");
????}
}
public class B extends A{
????int bb = 0;
????//2
????public B(){
????//5
??bb=1000;
????}
????//4
????public void a1(){
??System.out.println("bb is"+bb);
??System.out.println("B-a1");
????}
????public static void main(String []args){
??new B();
????}
}
答案:
bb is 0
B-a1
看看執行順序就明白了.
在方法被a1()被重寫的情況下,父類的a1是沒有機會
被調用的. ?
轉載于:https://blog.51cto.com/tscjsj/85891
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
- 上一篇: 通过批处理文件启动Oracle服务
- 下一篇: 解放你的双手-Sql Server 20