抽象类,接口,匿名内部类
1.抽象类
定义:用abstract修饰的类就是抽象类,抽象类可以包括实例变量,类变量,实例方法,类方法以及抽象方法,构造方法,常量,抽象类不能被实例化,子类继承抽象类,要么实现抽象方法,要么子类也是抽象类。
语法
public abstract class A{ //类变量 //实例变量 //构造方法 //实例方法 //类方法 }
抽象方法:被abstract修饰的方法就是抽象方法,抽象方法只有方法头,没有方法体,规定了子类的行为,子类继承抽象类,必须实现父类抽象方法,否则子类也应该是抽象类。
public abstract void eat();
2.接口
定义:接口不是类,而是对类的一组需求的描述,子类要遵守从接口描述的统一格式进行定义。
public interface A{}
Compareable接口
接口特性
接口是类,接口不能被实例化
接口中只能包含常量和抽象方法,静态方法和默认方法,其中常量的修饰符只能有pubic static final和default,并且可以省略,抽象方法的修饰只能有public abstract 和default,也可以省略
子类重写接口抽象方法时必须使用public修饰。
子类可以实现多个接口,接口之间用逗号隔开。
接口之家可以存着继承关系
接口和抽象类的区别
相同点:
不同点:
接口里只能包含抽象方法和默认方法,不能为普通方法提供方法实现;抽象类则完全可以包含成员方法。
接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
接口里不包含构造方法;抽象类里可以包含构造器,抽象类里的构造方法并不是用于创建对象。
接口里不能包含初始化块;但抽象类则完全可以包含初始化块
一个类最多只能有一个直接父类,包括抽象类;但是一个类可以直接实现多个接口,通过实现多个接口可以弥补java单继承的不足。
抽象类和接口都不能被实例化
接口和抽象类都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必须实现这些抽象方法
静态方法
在JDK1.8以后java中可以定义静态方法,并且静态方法可以具有方法体和方法实现。并且静态方法不需要子类重写或者实现。调用方式为:接口名.方法名(参数列表)。
默认方法
JDK1.8以后同样提供了默认方法,该方法被default修饰,可以具有方法体和方法实现。
解决默认方法中的冲突:
如果一个子类同时实现多个接口,并且接口中具有相同的默认方法,则子类必须重新默认方法解决冲突
如果一个子类实现了某个接口,接口又继承了另一个接口,子类重写默认方法时,如果需要调用父类默认方法,只能调用子类直接实现的接口的方法(就近原则)
4.内部类
非静态内部类
//1.内部类可以用private protected static修饰 //2.非静态内部类不能拥有static成员 //3.内部类可以访问外部类成员,反之则不可以 //4.如果外部类和内部类具有同名的成员变量,则需要使用this访问 /** * 外部内 * @author zl */ public class Woman { private int age; public Woman(int age) { super(); this.age = age; } public void create() { Baby baby = new Baby("安琪拉",3); } /** * 非静态内部类 * @author zl * */ public class Baby{ int age; String name; public Baby(String name,int age) { super(); System.out.println("执行了Baby内部类的构造方法"); this.name = name; this.age = age; } public void visited() { //访问外部类成员变量 System.out.println("woman age is=========="+Woman.this.age); //访问内部类成员变量 System.out.println("woman age is=========="+this.age); } } } //测试类 public class Test { public static void main(String[] args) { Woman woman = new Woman(19); Baby baby = woman.new Baby("小糯米",2); baby.visited(); } }
静态内部类
//1.静态内部类可以包含静态成员,也可以包含非静态成员 //2.静态内部类不能访问外部类的实例成员,只能访问外部类静态成员,如果访问外部类实例成员,需要内部中创建外部类对象 public class StaticInnerClass { static String gender; int money; public StaticInnerClass(int money) { super(); this.money = money; } public void create() { Inner inner = new Inner(); inner.visited(); } /** * 静态内部类 * @author MR.W */ static class Inner{ //静态成员 static String name; //非静态成员 int age; public void visited() { //访问外部类静态成员 System.out.println(gender); //访问外部类非静态成员 System.out.println(new StaticInnerClass(2000).money); } } } //测试类 public class Test { public static void main(String[] args) { //第一种外部类中定义方法,方法内实例化内部类,并实例化外部类,调用该方法(不推荐) StaticInnerClass staticInnerClass = new StaticInnerClass(1000); staticInnerClass.create(); //第二种 通过外部类. StaticInnerClass staticInnerClass = new StaticInnerClass.Inner(); } }
局部内部类
//1.局部内部类不能用static修饰,也不能使用访问修饰符 //2.局部内部类仅在当前方法内有效 /** * 局部内部类 * @author zl */ public class MethodInnerClass { public void say() { class Inner { } } }
匿名内部类
//1.匿名内部类不能是抽象类 //2.匿名内部类不能定义构造器 //接口 public interface IUsb { void service(); } public static void main(String[] args) { IUsb usb2 = new IUsb() { @Override public void service() { // TODO Auto-generated method stub } }; }
领取专属 10元无门槛券
私享最新 技术干货