JAVA基础--抽象类和接口

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方法
}
}
如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值