首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于Java抽象类和接口,你了解多少呢?

抽象类,接口,匿名内部类

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 } }; }

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200226A0RCW700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com