抽象类、接口、内部类
抽象类
抽象类定义的关键词:abstract
如果被定义成抽象类,那么他一定不能被实例化,只能通过子类完成实例化,重写方法。如果一个类有抽象方法,这个类肯定是抽象类。同时,abstract和static不能同时修饰一个方法。
接口
接口定义的关键词:interface
同样接口不能被实例化,只能被继承,重写方法,那么和抽象类具体有什么区别呢?
-
相同点
- 都不能被实例化,不可以被new出来
- 都是为了加强动态绑定,加强多态,鼓励重写
- 接口和抽象类都只能作为父类被继承
-
不同点
接口 | 抽象类 |
---|---|
可以被多继承implements | 只能被单继承extends |
接口中定义的一定都是final常量 | 抽象类中定义的可以自定义选择为final常量 |
接口中的方法不能有实现 | 抽象类中的方法可以被实现,作为子类的默认行为 |
接口中的访问修饰符都得是public来允许子类重写 | 抽象类中的访问修饰符可以是private、protected |
接口中不能有构造方法 | 抽象类中可以有构造方法 |
接口只能有常量和抽象方法(abstract可以省略) | 可以有非抽象方法 |
何时使用抽象类或接口
- 如果我们实现的功能是对迥然不同的对象都很有用,那么使用接口。抽象类主要用作紧密相关的对象之间,然而在给非相关的类提供通用方法时,接口是更好的选择。
- 在未来需要添加新方法时,选择抽象类更为合适。因为当我们在接口内添加新的方法时,所有实现该接口的类都需要添加新的方法
- 当我们有一些相似的多重继承时考虑使用接口,因为我们可以实现多重接口。
- 如果我们设计小巧而简单的功能时使用接口,如果我们设计庞大的功能单元,使用抽象类。
内部类
普通内部类
不能定义静态变量或者方法
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.