一、抽象类的特点
a、抽象类和抽象方法用abstract修饰
b、有抽象方法的类一定是抽象类
c、抽象类中不一定有抽象方法
d、抽象类不能被实例化
e、如果一个类继承抽象类,那么这个类必须要重写这个类中的所有抽象方法,除非这个类也是抽象类
疑问:抽象类不能被实例化,那抽象类是否有构造方法呢?有构造方法,是给成员变量赋值用的
作用:强制子类实现某些功能
成员特点: a、成员变量:可以有成员变量也可以有常量
b、构造方法:有构造方法,但不能被实例化
c、成员方法:可以有抽象方法,也可以有非抽象方法
格式:访问修饰符 abstract class 类名 {
成员变量;
成员方法;
}
二、接口的特点
a、用关键字 interface修饰
b、接口中的成员修饰符是固定的
成员常量:public static final 数据类型 变量名=值;
成员函数:public abstract 返回类型 方法名();
c、接口不能被实例化;
成员特点:a、成员变量:接口中的成员变量都是常量,因为接口的成员变量有默认修饰符:public static final
b、构造方法:接口中没有构造方法,因为接口中的数据都是静态常量,而构造方法是给成员变量赋值用的
d、成员方法:接口中的方法都是抽象的并且没有方法体,默认修饰符:public abstract
一个小知识点:cmd 编译时自动建包: javac -d . demo.java
-d后面的点表示在当前目录建立包
运行:java 包名.demo
格式:访问修饰符 interface 接口名 [extends 其它接口]{
public static final 数据类型 变量名=值;
public abstract 返回类型 方法名();
}
三、内部类
位置:a、成员位置-成员内部类 b、局部位置-局部内部类
成员内部类: 访问格式 外部类.内部类 变量=new 外部类().new 内部类();
成员内部类的修饰符:
private :防止外部随意创建,外界不能调用,通过在外部类中定义一个方法在方法中实现内部类的创建与调用
class Outer{
private class Inner{
public void show(){
}
}
public void fun(){
Inner i=new Inner();
i.show();
}
}
class OuterTest{
public static void main(String[] args){
Outer o=new Outer();
o.fun();
}
}
static: 访问格式: 内部类.外部类.方法
class Outer{
public static class Inner{
public void fun(){}
public static void show(){}
}
}
class OuterTest{
public static void main(String[] args){
Outer.Inner o=new Outer.Inner();
o.fun();
o.show();
//对于show也可以直接调用
Outer.Inner.show();
}
}
局部内部类:成员方法中定义的类
class A{
public void fun(){
final int num=10;
class Inner{
public void show(){}
}
Inner i=new Inner();
i.show();
}
}
class ATest{
public static void main(String[] args){
A a=new A();
a.fun();
}
}
局部内部类访问局部变量,该变量必须用final修饰;
为什么用final修饰?延长局部变量的生命周期,当局部类使用该局部变量时,方式局部变量从内从中消失。
匿名内部类:没有名字的局部内部类,前提:存在一个类,接口或抽象类
格式: new 类名或接口名()
{
重写类或接口中的方法;
也可以定义自己的方法;
};
interface Inner{
public abstract void show();
}
class Outer{
public void fun(){
new Inner(){
public void show(){// do what}
}.show();
}
}