JAVA基础--抽象类和接口

xiaoxiao2021-02-28  147

JAVA基础--抽象类和接口 2017-7-7 一、抽象类 抽象类可以定义普通的成员变量 可以有构造方法  抽象类里面既可以有具体实现的方法也可以有抽象的方法 如果一个类继承了抽象类,必须重写其抽象方法  除非子类也声明为抽象类 package zhangyu201777; public abstract class shape {      double c;      public shape(){      }      public shape(double c){           this.c=c;      }      abstract public double area(); } package zhangyu201777; public class Circle extends shape{      @Override      public double area() {           // TODO Auto-generated method stub           return 3.14*(c/2*3.14)*(c/2*3.14);      } } 抽象类不能实例化 abstract final 不能同时修饰一个类  因为final不可继承  抽象类的目的就是为了子类的继承重写方法 抽象类的意义: 为其子类提供一个公共的类型 封装子类中重复的内容(成员变量和方法) 定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的 由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法的实现,用一个分号结尾,一个类中如果包含抽象方法,该类应该用abstract关键字声明为抽象类。 如果一个类继承了抽象类,必须重写其抽象方法(除非该类也声明为抽象类) 抽象类里面可以有抽象方法,也可以没有。抽象类不能实例化。 一个类继承抽象类后,必须重写其抽象方法,不同的子类可以有不同的实现。 二、接口 定义一个接口 接口是特殊的抽象类,即只包含抽象方法的抽象类 接口所有方法都是隐含的抽象的方法  不可以定义成员变量 创建接口时不能选“class”  选择“interface” 实现接口 与继承不同,一个类可以实现多个接口,实现的接口直接用逗号分隔 当然,该类需要实现这些接口中定义的所有方法 一个类可以通过implements关键字实现接口。一个类实现了某个接口后必然实现该接口中定义的所有方法 接口可以作为一种类型声明变量,一个接口类型的变量可以引用实现了该接口的类的对象 通过该变量可以调用该接口中定义的方法(具体的实现类提供了方法的实现) 接口的继承 接口之间可以存在继承关系,一个接口可以通过extends关键字继承另外一个接口。 子接口继承了父接口中定义的所有方法 public interface Runner {      int i=1; //自动加上static final修饰词,不可以更改的常量,常量的名称所有字母都大写 } package zhangyu201777; public class AmericanCurl implements Hunnter {      public void run() {           System.out.println("AmericanCurl is running....");      }      public void hunt(){           System.out.println("hunt....");      } } 接口和抽象类的区别 1、接口中所有的方法隐含都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法。 2、类可以实现多个接口,但是只能继承一个抽象类 3、类如果要实现一个接口,它必须要实现接口声明的所有方法,但是,类可以不实现抽象类声明的所有方法当然,在这种情况下,类必须声明成抽象的。 4、抽象类可以在不提供接口方法实现的情况下实现接口 5、java接口中声明的变量默认都是final的,抽象类可以包含非final的变量 6、java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public 7、接口是绝对抽象的,不可以被实例化,抽象类也可以被实例化 多态的意义 1、一个类型的引用在指定不同的对象时会有不同的实现 职员emp1 = new 讲师(); 职员emp2=new 项目经理(); emp.1 完成工作(); emp.2 完成工作(); 2、同样一个对象,造型成不同的类型时,会有不同的功能。 讲师teacher = new讲师(); 企业技术顾问 consultant = teacher; 技术图书作者 aughor = teacher; consultant.培训员工(); aughor.制作课件(); 强制转换类型 父类的引用指向子类的对象  才能强制转换为子类的对象 可以通过强制转换将父类型变量转换为子类型变量,前提是该变量指向的对象确实是该子类型 也可以通过强制转换将变量转换为某种接口类型,前提是该变量指向的对象确实实现了该接口 如果在强制转换过程中出现违背上述两个前提,将会抛出ClassCastException Instanceof关键词 在强制转型中,为了避免出现 ClassCastException,可以通过Instanceof关键词判断某个类型是否为指向类型 定义成员内部类 一个类可以定义在另一个类的内部,定义在类内部的类称为Inner,其所在的类称之为Outer Inner定义在Outer类内部。通常只服务于Outer,对外部不具备可见性 Inner可以直接调用Outer的成员及方法(包括私有的) 创建内部类对象 一般情况下,Inner对象会在Outer对象中创建(构造方法或其他方法);Inner对象中会有一个隐式的引用指向创建它的Outer类对象。 public class Outer {      private int time;      private Inner inner;      Outer(int time){           this.time=time;           inner = new Inner();           inner.timeInc();      }      public void printTime(){           System.out.println(time);      }      class Inner {           public void timeInc(){           time++;           }      }      public static void main(String[] args){           Outer outer= new Outer(100);           outer.printTime();      }      //上面代码的输出结果为:101;  在Outer构造方法中创建的Inner对象会有一个隐式的引用指向创建      //它的Outer对象,调用Inner对象的timeInc方法,即会对Outer的time属性进行操作。 //一般成员变量都定义为private  通过创建get  set 方法调用内部类 定义匿名内部类 public interface Action{      public void execute(); } public class Main{      public static void main(String[] args){           Action actin = new Action(){                public void execute(){                     System.ouy.println("Hello,World");           }      };      action.execute();      //代码中创建了实现Action接口的内部匿名类对象,并调用其execute方法 } } 如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类。
转载请注明原文地址: https://www.6miu.com/read-25221.html

最新回复(0)