内容组成:
1、抽象方法
2、接口
3、成员内部类
4、局部内部类
5、匿名内部类
抽象方法用来干什么呢?
当我们想要定义一个类的时候,通常会需要定义一些方法来描述这个类的行为特征,但是,当我们又还没想好要具体实现一个怎样的方法的时候,抽象方法就派上用场了。抽象方法必须使用abstract关键字修饰,不需要实现它的方法体。
当一个类中含有了抽象方法,那这个类就是抽象类,相应地也需要abstract关键字来修饰。
抽象方法的基本语法格式:
[修饰符] abstract class 类名{
[修饰符] abstract 返回值类型 抽象方法名([参数1],[参数2]...); //这里注意要以分号为结束
...其它...
}
注意点:
1、抽象类不可以被实例化
2、抽象类里面可以不包含抽象方法;抽象方法里可以有普通方法,但是存在抽象方法的类一定是抽象类
3、当需要调用抽象类里的抽象方法时,必须事先创建一个子类来继承抽象类,并在子类里实现抽象方法体
4、抽象类存在着构造方法。可以在其子类的构造方法中使用super调用父抽象类的构造方法
现在我们来看一下接口:
当抽象类中的方法全部为抽象方法时,就可以将这个类定义为另一种形式:接口。
接口的基本语法格式:
[修饰符] interface 接口名 [extends 父接口1,父接口2...]{
[public] [static] [final] 类型 常量名=常量值;
[public] [abstract] 返回值类型 方法名([参数1],[参数2]...);
[public] default 返回值类型 方法名([参数1],[参数2]...){
...默认方法的方法体...
}
[public] static 返回值类型 方法名([参数1],[参数2]...){
...静态方法的方法体...
}
}
注意点:
1、接口是一种特殊的抽象类
2、静态方法可以直接通过“ 包名.接口名.静态方法名 ”来调用
3、抽象方法和默认方法只能通过接口实现类的实例对象来调用
4、接口中的变量在给定了值之后就无法更改了
5、类可以使用implements关键字去实现接口,接口与接口之间可以通过extends实现继承,类也是一样
成员内部类:
在一个类中,不仅可以有变量和方法,还可以定义类(被称作成员内部类)。
在成员内部类中,可以访问外部类的所有成员,包括成员变量和方法;在外部类中同样也可以访问成员内部类的变量和方法。成员内部类的语法格式与其它类一样。
但是创建内部类对象的语法格式有些不同:
外部类名.内部类名 变量名 =new 外部类名().new 内部类名();
局部内部类
局部内部类和局部变量一样,都是在方法中定义,其有效范围只限于方法内部。
在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,但是局部内部类中的变量和方法只能在创建该局部内部类的方法中进行访问。
附一个小代码来缕一缕:
package com.company;
interface tasting{
void tasty();
}
abstract class Fruit{
public String brand;
public abstract void show();
}
abstract class F{
public abstract void show1();
}
class Apple extends Fruit implements tasting{
public void tasty(){
System.out.println("好吃!");
}
public void show(){
super.brand="红富士苹果";
System.out.println("Apple:"+super.brand);
class Pear extends F{
String brand="梨子";
public void show1() {
System.out.println("Pear:" + brand);
}
}
Pear p=new Pear();
p.show1();
}
}
public class Task{
public static void main(String[] args) {
Apple a=new Apple();
a.show();
a.tasty();
}
}
结果:
Apple:红富士苹果
Pear:梨子
好吃!
匿名内部类
如果一个方法的参数是一个接口类型,除了可以传入一个参数接口实现类,还可以使用匿名内部类实现接口来作为该方法的参数。
基本语法格式:
new 父接口(){
...匿名内部类实现内容...
}
看一个小代码:
package com.company;
interface Animal{
void shout();
}
public class MyThread{
public static void main(String[] args){
String name="小猫";
cat(new Animal(){ //通过匿名内部类的形式传入一个接口
public void shout(){ //实现接口里的方法
System.out.println(name+"喵喵!");
}
}); //要以分号结束
}
public static void cat(Animal an){
an.shout(); //调用参数的shout方法
}
}
运行结果:
小猫喵喵!