概要
最近在求職找工作,從網(wǎng)上找了一些Java筆試題來做,很多都是基礎(chǔ)題,其中包含了一些關(guān)鍵的知識點,如父子類執(zhí)行順序等問題。題目來源參考博客。
題目
1. 以指定編碼輸出字符串,如“utf-8”
代碼實現(xiàn)如下:
package coding;
public class Coding {
public static void main(String agrs[])
{
String s = "hello你好";
try {
String name = new String(s.getBytes(),"utf-8");
System.out.println(name);
}catch(Exception e)
{
e.printStackTrace();
}
}
}
2.給定整型數(shù)組用冒泡法升序排序
代碼實現(xiàn)如下:
package bubble;
public class Bubble {
public static void main(String agrs[])
{
int a[] = {3,1,2,6,7,8,9,5,4};
int temp = 0;
for(int i=0;i<a.length;i++)
{
for(int j=i+1;j<a.length;j++)
{
if(a[i]>a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
}
3.求階乘
這里采用遞歸求解,也可以通過循環(huán)求解。
代碼實現(xiàn)如下:
package factorial;
public class Factorial {
public static int calculate(int n)
{
int factorial = 0;
if(n>1)
{
factorial = n*calculate(n-1);
}
else {
return 1;
}
return factorial;
}
public static void main(String agrs[])
{
System.out.println(calculate(6));
}
}
4.給定字母字符串按每個字母升序排序
代碼實現(xiàn)如下:
package sort;
import java.util.Arrays;
public class Letter {
public static void main(String args[])
{
String s = "apple";
char c[] = s.toCharArray();
Arrays.sort(c);
for(char element : c)
{
System.out.println(element);
}
}
}
5.給定數(shù)字字符串按數(shù)字大小升序排序
代碼實現(xiàn)如下:
package sort;
import java.util.Arrays;
public class Digital {
public static void main(String agrs[])
{
String s = "893158361";
char c[] = s.toCharArray();
Arrays.sort(c);
for(char element :c)
{
System.out.println(element);
}
}
}
6.給定一個整型數(shù)組輸出只出現(xiàn)過一次的數(shù)
代碼實現(xiàn)如下:
package unique;
public class Unique {
public static void main(String agrs[])
{
int a[] = {1,5,0,1,0,2,0,2,1,0};
int count =0;
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length;j++)
{
if(a[i]==a[j])
{
count++;
}
}
if(count==1)
{
System.out.println(a[i]);
}
count=0;
}
}
}
7.實現(xiàn)一個單例模式
單例模式是常用設(shè)計模式中的一種
以下用兩種方法實現(xiàn)單例模式
-
饑餓式單例
在類還沒有初始化之前就已經(jīng)產(chǎn)生類的實例了,所以是線程安全的。
實現(xiàn)代碼如下:
package single;
public class HungrySingle {
/*
* 饑餓單例模式
*/
private static HungrySingle hungrySingle = new HungrySingle();
private HungrySingle()
{
}
public static HungrySingle getHungrySingle()
{
return hungrySingle;
}
public void say()
{
System.out.println("HungrySingle instance.");
}
}
-
雙重檢鎖式單例
在使用時才創(chuàng)建單例對象,因為在創(chuàng)建時檢查單例對象是否為null和使用了synchronize鎖住類,確保單例以及線程安全。
實現(xiàn)代碼如下:
package single;
public class DoubleCheckLockSingle {
/*
* 雙重檢鎖單例模式
*/
public static DoubleCheckLockSingle doubleCheckLockSingle = null;
private DoubleCheckLockSingle()
{
}
public static DoubleCheckLockSingle getDoubleCheckSingle()
{
if(doubleCheckLockSingle==null)
{
synchronized(DoubleCheckLockSingle.class)
{
if(doubleCheckLockSingle==null)
{
doubleCheckLockSingle = new DoubleCheckLockSingle();
}
}
}
return doubleCheckLockSingle;
}
public void say()
{
System.out.println("DoubleCheckLockSingle instance.");
}
}
8.字符串變量
實現(xiàn)代碼如下:
package stringVariable;
public class StringVariable {
public static void main(String args[])
{
String s = "123";
s = "abc";
System.out.println(s);
}
}
9.父子類基礎(chǔ)問題
Java中繼承問題一個??嫉念}目,其中包括父子類加載順序問題和子類隱藏父類的成員變量方法以及子類覆蓋父類的方法。
-
父子類加載順序問題
先看父類代碼:
package executeOrder;
public class Father {
private String name;
public Father()
{
System.out.println("父類的無參構(gòu)造方法");
}
public Father(String name)
{
this.name = name;
System.out.println("父類的有參構(gòu)造方法");
}
static {
System.out.println("父類的靜態(tài)代碼塊");
}
{
System.out.println("父類的非靜態(tài)代碼塊");
}
public String getName()
{
System.out.println("父類的普通方法");
return this.name;
}
public static void main(String args[])
{
System.out.println("父類的主程序");
Father father = new Father("Tom");
father.getName();
}
}

可以看到父類中加載順序為:父類的靜態(tài)代碼塊--父類主程序--父類的非靜態(tài)代碼塊--父類的有參構(gòu)造方法--父類的普通方法。
-
子類繼承父類加載順序
如果只是父類加載順序并不是很復(fù)雜,但是如果通過子類中繼承,子類中加載順序就變得稍微有些復(fù)雜。
以下為子類代碼:
package executeOrder;
public class Children extends Father{
private String name;
public Children()
{
System.out.println("子類的無參構(gòu)造方法");
}
public Children(String name)
{
this.name = name;
System.out.println("子類的有參構(gòu)造方法");
}
static {
System.out.println("子類的靜態(tài)代碼塊");
}
{
System.out.println("子類的非靜態(tài)代碼塊");
}
public String getName()
{
System.out.println("子類的普通方法");
return this.name;
}
public static void main(String agrs[])
{
System.out.println("子類的主程序");
Father father = new Father("Tom");
father.getName();
Children children = new Children("Gavin");
children.getName();
}
}

子類中繼承父類后執(zhí)行順序發(fā)生了一些變化,加載順序可以分為三個部分,第一部分為:父類的靜態(tài)代碼--子類的靜態(tài)代碼塊--子類主程序,在這部分只執(zhí)行一次不管后面有多少實例 。第二部分new了一個父類實例,執(zhí)行順序為:父類的非靜態(tài)代碼塊--父類的有參構(gòu)造方法--父類的普通方法。第三部分new了一個子類實例,執(zhí)行順序為:父類的非靜態(tài)代碼塊--父類的無參構(gòu)造方法--子類的非靜態(tài)代碼塊--子類的有參構(gòu)造方法--子類的普通方法。
-
子類隱藏父類的成員變量,子類覆蓋父類的方法
父類代碼如下:
package inherit;
public class Father {
private String name ="爸爸";
int age = 39;
public void say()
{
System.out.println("I am father.");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
子類代碼如下:
package inherit;
public class Children extends Father{
private String name;
int age = 16;
public void say()
{
System.out.println("I am children.");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
測試類代碼:
package inherit;
public class Test {
public static void main(String agrs[])
{
Father father = new Father();
System.out.println("name is "+father.getName());
System.out.println("age is "+father.age);
father.say();
System.out.println("-------------------------------------");
Father son = new Children();
son.setName("兒子");
System.out.println("name is "+son.getName());
System.out.println("age is "+son.age);
son.say();
System.out.println("-------------------------------------");
Children daughter = new Children();
daughter.setName("女兒");
System.out.println("name is "+daughter.getName());
System.out.println("age is "+daughter.age);
daughter.say();
}
}

通過執(zhí)行結(jié)果可以看出,子類可以覆蓋父類的同名方法,子類可以隱藏父類的同名成員變量,但是在子類轉(zhuǎn)換為父類型時同名成員變量為父類的值。
相關(guān)概念如下:
隱藏 :child隱藏了parent的變量和方法,那么,child不能訪問parent被隱藏的變量或者方法,但是,講B轉(zhuǎn)換成A中,可以訪問A被隱藏的變量或者方法。
覆蓋 :child覆蓋了parent的變量或者方法,那么,child不能訪問parent被覆蓋的變量或者方法,將child轉(zhuǎn)換成parent后同樣不能訪問parent被覆蓋的變量或者方法。
隱藏和覆蓋的規(guī)則
1.父類的實例變量和靜態(tài)變量能被子類的同名變量隱藏
2.父類的靜態(tài)方法被子類的同名靜態(tài)方法隱藏
3.父類的實例方法被子類的同名實例方法覆蓋
4.不能用子類的靜態(tài)方法隱藏父類中同樣標(biāo)示(也就是返回值 名字 參數(shù)都一樣)的實例方法
5.不能用子類的實例方法覆蓋 父類中同樣標(biāo)示的靜態(tài)方法
6.這點兒請注意,就是變量只會被隱藏 不會被覆蓋 ,無論他是實例變量還是靜態(tài)變量,而且子類的靜態(tài)變量可以隱藏父類的實例變量,子類的實例變量可以隱藏父類的靜態(tài)變量
小結(jié)
以上都是一些比較常見的基礎(chǔ)題,對于大多數(shù)人來說沒有太大的難度,其中包含了一些小知識,有興趣的朋友可以拿來鞏固一下基礎(chǔ),學(xué)習(xí)編程基礎(chǔ)真的很重要。多多支持呀,謝謝大家!