Java学习笔记----一些常用却不清楚的知识

一.抽象类(abstract class) 与接口(interface)的异同

  • 相同点
  1. 都不能被实例化
  2. 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化。
  • 不同点
  1. 接口只有定义,其方法不能再接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
  2. 接口需要实现,但抽象类只能被继承,一个类可以实现有多个接口,但只能继承一个抽象类。
  3. 接口强调特定功能的实现,其设计理念是“has - a”关系;而抽象类强调所属关系,其设计理念为“is - a”关系。
  4. 接口中定义的成员变量默认为public static final,只能够有静态的不能被修改的数据成员,而且只能够有静态的不能被修改的数据成员,而且,必须给其赋初值,其所有成员方法都是public,abstract的,而且只能被这两个关键字修饰。而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法,而且,抽象类中的成员变量默认为default,当然也可以被定义为private,protected和public,这些成员变量可以在子类中被重新定义,也可以被重新赋值,抽象类中的抽象方法不能用private、static、synchronized、native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号。所以,当功能需要积累时,用抽象类;不需要累积时,用接口。
  5. 接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。
二.内部类有哪些

  • 静态内部类
class outerClass{
         static class innerClass{}
}


  • 成员内部类
class outerClass{
      class innerClass{}
}


  • 局部内部类
class outerClass{
    public void menberFunction(){
              class innerClass{}
    }

}
  • 匿名内部类
public class MyFrame extends Frame{
   public MyFrame(){
   addWindowListener(new WindowAdapter(){
       public void windowClosing(WindowEvent e){
       dispose();
       System.exit(0);
}
  })
  }
}


常见笔试题:

public class OuterClass{
       private int d1 =1;
      //编写内部类
}
先需要在这个外部类中定义一个内部类,下面哪个定义是正确的?()
A. class InnerClass{
	public static int method(){
		return d1;
	}
}
B.public class InnerClass{
   static int method(){
		return d1;	
   }
}
C.private class InnerClass{
	public  int method(){
		return d1;
	}
}
D.static class InnerClass{
	protected  int method(){
		return d1;
	}
}
E.private class InnerClass{
	abstract private  int method();
}


答案是C 、E ,由于在非静态内部类中不能定义静态成员,因此A和B是错误的。由于静态类内部类不能访问外部类的非晶态成员变量,因此D是错误的。

三.如何获取父类的类名

public class Test extends A{
	public void test(){
	System.out.println(this.getClass().getName());
	System.out.println(this.getClass().getSuperClass().getName());
	}
	public static void main(String args[]){
	new Test().test();
 	}
}

运行结果是:Test

               A

四.this与super的区别

  • this用来指向当前实例对象。
  • super可以用来访问父类的方法或成员变量。
常见笔试题:下面的程序运行结果是什么?

class Base{
	public Base(){
		System.out.println("Base");
	}
}
class Sub extends Base{
	public Sub(){
		System.out.println("Sub");
		super();
	}
}
public class Test{
	public static void main(String args[]){
	Base s = new Sub();
	}
}


答案是:编译错误。当子类构造函数需要显示调用父类构造函数时,super()必须为构造函数的的第一条语句,因此正确的写法如下:

public Sub(){
	super();
	System.out.println("Sub");
}

五.final、finally 和 finalize有什么区别?

  • final 用于声明属性、方法和类,分别表示属性不可变,方法不可覆盖和类不可被继承。
  • finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,便是这段语句最终一定被执行,经常被用在需要释放资源的情况下。
  • finalize是Object类的一个方法,在垃圾回收器执行时会被调用回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收。





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值