java 接口、抽象类、具体类、内部类、匿名内部类的区别及它们之间的关系

大家面试的时候肯定被问过java 接口、抽象类、类、内部类、匿名内部类的区别及它们之间的关系。那么下面我就来整理下它们之间的关系。(主要是总结了下网上的资料,不是自己原创的。)总结的不好,请勿喷。^_^
java 接口:
 使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:

[修饰符] interface 接口名 [extends 父接口名列表]{

[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。(个人习惯:在接口类名前先写一个I_后面跟着接口名称)
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。
方法:接口中的方法只有定义而没有被实现。

接口中可以定义变量和方法,但是一般人不会在接口中定义变量,因为在接口中定义的变量会被隐式的定义为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误)。说java接口中的方法必须是抽象方法。如果接口中存在非抽象方法,编译器会编译不过去,就会报错。并且接口中所有的方法不能有具体的实现。说java接口中的方法必须是抽象方法。如果接口中存在非抽象方法,编译器会编译不过去,就会报错。并且接口允许任何类去实现它,一个类如果实现一个接口,那么这个类就要把这个借口中的所有方法都实现了。

所以说java接口中的方法都是极度抽象的类型,它比抽象类更加严格的“抽象”。

其实java中的接口是为了解决java中单继承而来的,大家都知道,java中一个类只能有继承一个父类,不像C++中可以多继承,一个孩子可以有多个爸爸。java严格按照我们生活中的人与人的关系,一个孩子只能有一个爸爸,但是可以有多个干爹(现在的干爹都不靠谱啊,原因你懂的。),一个孩子可以继承父亲的所有遗产,但是也可以拥有多个干爹的遗产,前提是他的干爹愿意把遗产给他。(这里指的是别的接口中的方法)。

java 抽象类:
下面是java抽象类的定义语法。
public abstract class Demo01 {

	public abstract void addUser();//抽象方法
	
}
java抽象类必须要以abstract  来进行修饰,抽象类可以继承抽象类。一个类中存在一个抽象方法,那么这个类必须要定义成抽象类。java中抽象类的访问控制修饰符默认是public类型的,抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。因为,抽象方法没有方法体,是用来被继承的,所以不能用private修饰;static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;使用synchronized关键字是为该方法加一个锁。。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以,锁应该归其子类所有。所以,抽象方法也就不能用synchronized关键字修饰了;native这个东西本身就和abstract冲突,他们都是方法的声明,只是一个把方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢?  总之:抽象类是提取具体类的公因式。
java 内部类:
java内部类一般使用不是很多,但是其实也很好理解。就是一个类中再次定义了一个类。可以理解为在一个大的厂房里面又盖了个小的厂房。大厂房有它自己的构造组成。小厂房也是有小厂房的构造组成的。内部类破坏了良好的代码结构,但是我们平时还是需要用到的,因为内部类可以随意使用外部类的属性和方法。
下面是内部类访问外部类的示例及内部类的基本格式:
package test;

public class test {
	private String name = "小熊猫";
	
	
	class in {
		private String name = "丢丢";
		
		public void sal(){
			String name = "小熊猫丢丢";
			
			System.out.println("局部变量name:"+name);
			System.out.println("内部类变量name:"+this.name);
			System.out.println("外部类变量name:"+test.this.name);
			
		}
		
	}
	
	public static class ma {
		public static void main(String[] args) {
			test.in in = new test().new in();
			in.sal();
			
		}
	}

}

其实java内部类也是一个类,与其他类不同的是内部类是类中类,它的作用范围只能在这个类中。

java 匿名内部类:
匿名内部类的定义语法如下:

new 父类构造器(参数列表)|实现接口()    
    {    
     //匿名内部类的类体部分    
    } 
虽然看上去很简单,但是还有一些注意事项需要我们注意的:
1:使用匿名内部类必须实现一个接口或者继承一个类,但是鱼和熊掌不可兼得,至于是继承类还是实现接口需要根据业务要求去走了。
2:匿名内部类中不可以定义构造函数。
3:匿名内部类中不可以有任何静态方法和静态成员变量(这个是因为静态方法或者静态成员变量在加载的时候会直接加载,而普通的成员变量或方法需要在类加载的时候才会去       加载)
4:匿名内部类也是局部内部类,所以局部内部类的限制对匿名内部类同样有效。
5:匿名内部类不能是抽象的,它必须要实现继承的类或者实现接口中所有的抽象方法。


关于java类的一些类就先写到这了,下面会陆续写一些关于多线程与高并发的一些文档,如有一些不对的地方欢迎大家指出,大家共同学习共同进步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值