面向对象:抽象类,接口,内部类

抽象类:


抽象类的概念:

Java中可以定义没有方法体的方法,方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类;

通常在编程语句中用 abstract 修饰的类是抽象类。抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。

抽象类的特点:

1)抽象类和抽象方法必须用关键字abstract修饰
2)抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
3)抽象类不能实例化

语法格式:

修饰符 abstract 返回值类型 方法名([参数列表]);

[public] abstract class ClassName {
    //可以定义类所有的内容
    //可以定义接口中所有的内容
}

抽象类的声明:

语法:修饰符 abstract class 类名 extends 父类名
抽象类中可以没有抽象方法;但是一旦某个有抽象方法,那么这个类必须被声明为抽象类。

抽象类和普通类的主要区别:

1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

接口:


接口(interface),在软件工程中,接口泛指供别人调用的方法或者函数。

语法:修饰符 interface 接口名{[常量];[抽象方法];}

[public] interface 接口名{
     //定义常量
     public static final 数据类型 常量名 = 值;
     //定义抽象方法
     public abstract 返回值类型  方法名(数据类型 参数名,...);
}

接口中抽象方法可以不写abstract关键字,访问修饰符默认public
接口中所有的方法不能有具体的实现,当类实现接口时,需要去实现接口中的所有抽象方法,否则需要将该类设置为抽象类;
接口中可以包含常量,默认public static final
接口也可以实现继承,并且可以继承多个父接口

抽象类和接口的相似:

1)不能实例化;
2)包含未实现的方法声明;
3)派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)。

抽象类和接口的区别:

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
5)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。

内部类:


定义在其他类内部的类。

内部类可以分为:

1)成员内部类:

  • 定义在外部类的成员(属性、方法)位置
  • 可以使用四种访问权限修饰符修饰内部类
  • 可以在内部类的内部定义属性和方法
    例:
public class Outer {
    private int a = 1;
    //成员内部类
    class Inner{
        public void print(){
            //可以访问外部类的私有属性
            System.out.println(a);
        }
    }
}

创建内部类对象:先要创建外部类对象,然后使用外部类对象创建内部类对象

//创建外部类对象
Outer out = new Outer();
//创建内部类对象
Outer.Inner in = out.new Inner();
in.print();

2)静态内部类:

  • 静态内部类是在内部类前面加上static
  • 静态内部类不需要创建外部对象
  • 只能访问外部类静态的属性或方法
  • 访问静态内部类当中的静态成员:Outter.Inner.color
    例:

    public class Outer {
        private int a = 1;
        private static int b = 2;
        //静态内部类
        class static class Inner{
            public void print(){
                //只能访问静态属性
                System.out.println(b);
            }
        }
    }

3)局部内部类:

  • 局部内部类只能定义在方法当中使用
  • 局部内部类当中是不能包含静态变量
  • 局部内部类当中可以包含局部变量,使用的局部变量的本质是final变量
    例:

    public class Outer {
        private int a = 1;
        private void print(final int b){
        //局部内部类
        class Inner{
            public void print(){
                System.out.println(a);
                System.out.println(b);
                }
            }
        }
     }

4)匿名内部类:(属于局部内部的一种特殊情况)

  • 匿名内部类不知道类名,所以不能定义构造方法,只能使用默认无参的构造方法。
  • 只使用一次的时候,就使用匿名内部类
  • 匿名内部类必须知道它的父类或实现的接口

使用内部类的意义:

1)增强封装,把内部类隐藏在外部类当中,不允许其他类访问这个内部类
2)增加了代码一个维护性
3)内部类可以直接访问外部类当中的成员

你可能感兴趣的