抽象类:
抽象类的概念:
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)内部类可以直接访问外部类当中的成员
网友评论