抽象类、接口、内部类

抽象类

抽象类定义的关键词:abstract
如果被定义成抽象类,那么他一定不能被实例化,只能通过子类完成实例化,重写方法。如果一个类有抽象方法,这个类肯定是抽象类。同时,abstract和static不能同时修饰一个方法。

接口

接口定义的关键词:interface
同样接口不能被实例化,只能被继承,重写方法,那么和抽象类具体有什么区别呢?

  1. 相同点

    1. 都不能被实例化,不可以被new出来
    2. 都是为了加强动态绑定,加强多态,鼓励重写
    3. 接口和抽象类都只能作为父类被继承
  2. 不同点

接口抽象类
可以被多继承implements只能被单继承extends
接口中定义的一定都是final常量抽象类中定义的可以自定义选择为final常量
接口中的方法不能有实现抽象类中的方法可以被实现,作为子类的默认行为
接口中的访问修饰符都得是public来允许子类重写抽象类中的访问修饰符可以是private、protected
接口中不能有构造方法抽象类中可以有构造方法
接口只能有常量和抽象方法(abstract可以省略)可以有非抽象方法

何时使用抽象类或接口

  1. 如果我们实现的功能是对迥然不同的对象都很有用,那么使用接口。抽象类主要用作紧密相关的对象之间,然而在给非相关的类提供通用方法时,接口是更好的选择。
  2. 在未来需要添加新方法时,选择抽象类更为合适。因为当我们在接口内添加新的方法时,所有实现该接口的类都需要添加新的方法
  3. 当我们有一些相似的多重继承时考虑使用接口,因为我们可以实现多重接口。
  4. 如果我们设计小巧而简单的功能时使用接口,如果我们设计庞大的功能单元,使用抽象类。

内部类

普通内部类

不能定义静态变量或者方法

public class Outer {
	int  a = 10;
     class Inner
	{
    	 int  a = 20;
    	 public void innerShow()
    	 {
    		 System.out.println("innerShow方法-->"+this.a+","+Outer.this.a);
    	 }	
	} 
     public static void main(String[] args) {	 
    	 //创建内部类对象机制  外部类.内部类  内部类对象  = new 外部类().new 内部类();
    	 Outer.Inner  inner  = new Outer().new Inner();
    	 inner.innerShow();	
	}
}

静态内部类

静态内部类的创建不需要依赖外部类可以直接创建
静态内部类可以存在自己的成员变量包括非静态和静态属性和方法

public class Outer1 {
	int  b =30;
	static class Inner1
	{	
		static {		
		}
		static  int   num  =10;
		int  b =20;
		 public void innerShow()
    	 {
    		 System.out.println("innerShow方法-->"+this.b+","+new Outer1().b);
    	 }
		 public static  void check()
		 {
			 System.out.println("check方法-->"+new Inner1().b+","+new Outer1().b);
		 }
	}
	public static void main(String[] args) {
		//Outer1.Inner1  in1  =new Outer1.Inner1();
		Outer1.Inner1  in1  =new Inner1();
		in1.innerShow();	
	}
}

还有局部内部类和匿名内部类,小编着实感觉不知道有啥特别实操作用,也都是百度的那些,要是有了解的伙伴可以评论给小编讲讲呀~~

Q.E.D.