Java高级类特性的问答题2

abstract class 和interface 有什么区别? 
答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,
并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型
是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们
父类中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中实现该方法。知道其行为的其它类
可以在类中实现这些方法

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。
接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,
除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。
然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的
类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象
的类是否实现了接口

--------------------------------------------------
abstract 的方法是否可同时是static,是否可同时是native,是否可同时是synchronized?
答:都不能

--------------------------------------------------
是否可以从一个static方法内部发出对非static方法的调用?
答:不可以,如果其中包含对象的method();不能保证对象初始化.

--------------------------------------------------
写一个Singleton出来
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种形式:

/* 第一种形式: 定义一个类,它的构造函数为private的,
 * 它有一个static的private的该类变量,在类初始化时实例化,
 * 通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
 */
public class Singleton {
	private Singleton() {
	}

	private static Singleton instance = new Singleton();

	public static Singleton getInstance() {
		return instance;
	}
}
//第二种形式: 
public class Singleton {
	private Singleton() {
	}

	private static Singleton instance = null;

	public static synchronized Singleton getInstance() {
		if (instance == null){
			instance = new Singleton();
		}
		return instance;
	}
}

 其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
--------------------------------------------------

接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

答:接口可以继承接口,抽象类可以实现(implements)接口。
抽象类可继承实体类,但实体类必须不能是如下两种情况之一:   
1,final修饰符修饰的类
2,此实体类有且仅有private构造函数

--------------------------------------------------
Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)

答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现

--------------------------------------------------

谈谈final, finally, finalize的区别
答:final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。
被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,
不能重载


finally—在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,
然后控制就会进入 finally 块(如果有的话)


finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类
都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除
对象之前对这个对象调用的

--------------------------------------------------
如下程序是否可通过编译?

public class Something {
	public int addOne(final int x) {
		return ++x;
	}
}

答案: 不能。int x被修饰成final,意味着x不能在addOne method中被修改。
--------------------------------------------------

abstract class Name {
	private String name;

	public abstract boolean isStupidName(String name) {}
}

有何错误?

答案: abstract method必须以分号结尾,且不带花括号。

--------------------------------------------------
如下程序是否可通过编译?

public class Something {
	public static void main(String[] args) {
		Other o = new Other();
		new Something().addOne(o);
	}

	public void addOne(final Other o) {
		o.i++;
	}
}

class Other {
	public int i;
}

答案: 能。在addOne 方法中,参数o被修饰成final。

如果在addOne 方法里修改了o的指向(比如: o = new Other();),那么这题则是错的。

但这里修改的是o的成员变量,而o的指向并没有改变。

--------------------------------------------------

public class Something {
	public static void main(String[] args) {
		Something s = new Something();
		System.out.println("s.doSomething() returns " + doSomething());
	}

	public String doSomething() {
		return "Do something ...";
	}
}

答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。
但仔细看,main是static的。static method不能直接call non-static methods。
可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。
同理,static method不能访问non-static instant variable。

--------------------------------------------------
是否可以通过编译?

abstract class Something {
	private abstract String doSomething();
}

答案: 否。abstract的方法不能以private修饰。

abstract的方法就是让子类实现具体细节的,不可以用private把abstract方法封锁起来, (同理,abstract method前不能加final)。

--------------------------------------------------
是否可以通过编译?

class Something {
	int i;

	public void doSomething() {
		System.out.println("i = " + i);
	}
}

答案: 正确。输出的是"i = 0"。

int i属于叫成员变量,成员变量有初始值,int的初始值是0。

--------------------------------------------------
接上题

class Something {
	final int i;

	public void doSomething() {
		System.out.println("i = " + i);
	}
}

和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?
答案: 错。final int i是个final的成员变量。final的成员变量没有初始值,必须在构造器结束前被赋予一个明确的值。

可以修改为"final int i = 0;"。

--------------------------------------------------

interface A {
	int x = 0;
}

class B {
	int x = 1;
}

class C extends B implements A {
	public void pX() {
		System.out.println(x); // super.x A.x
	}

	public static void main(String[] args) {
		new C().pX();
	}
}

答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,
两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,
而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。

--------------------------------------------------
写出程序结果

interface A {
}

class B implements A {
	public String func() {
		return "func";
	}
}

class Demo {
	public static void main(String[] args) {
		A a = new B();
		System.out.println(a.func());
	}
}

编译失败:A接口中未定义func方法。

--------------------------------------------------
写出程序结果

class TD {
	int y = 6;

	class Inner {
		static int y = 3;

		void show() {
			System.out.println(y);
		}
	}
}

class TC {
	public static void main(String[] args) {
		TD.Inner ti = new TD().new Inner();
		ti.show();
	}
}

编译失败,非静态内部类中不可以定义静态成员。
内部类中如果定义了静态成员,该内部类必须被静态修饰。

--------------------------------------------------
写出程序结果

public class Demo {
	private static int j = 0;

	private static boolean methodB(int k) {
		j += k;
		return true;
	}

	public static void methodA(int i) {
		boolean b;
		b = i < 10 | methodB(4);
		b = i < 10 || methodB(8);
	}

	public static void main(String args[]) {
		methodA(0);
		System.out.println(j);
	}
}

//4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值