接口和抽象类
类是抽象的概念,仅仅是模版。比如“人”类
对象是一个你能看得到、摸得着的具体实体
类的成员:属性、方法和构造函数等
权限修饰符:private public protected 缺省
方法的参数传递方式
方法的重载与重写
构造器(构造函数) 与类同名 不允许有返回类型
封装-把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性;
继承-通过继承可以复用父类的代码;
多态-允许将子对象赋值给父对象的一种能力。
对象的创建与引用
对象首先要进行声明: 类名 变量名;
创建对象的一般格式如下:变量名=new 构造方法(参数);
声明和创建可以合写成一句:
类名 变量名=new 构造方法(参数);
如: Person p1 = new Person(“zhangsan”);
封装
1、事物的内部实现细节隐藏起来
2、对外提供间接访问隐藏数据的方式
3、可维护性
多态
多态性指的是什么?多态性,可以理解为一个事物的多种表型形态。在Java中有两种体现:
方法的重载(overload)和重写(overwrite)
对象的多态性(可以直接应用在抽象类和接口上)
对象的多态性是什么?:一个对象多种形态;Java中,父类的引用既可以指向父类的对象,也可以指向子类的对象。但子类的引用不能指向父类的对象。
引用类型也可以进行类型转换。
但转换的类型一定具有继承关系,即仅允许父子类之间进行转换。
如果尝试将毫无关联的两个类型进行转换,将会引发编译错误。可以使用instanceof来判断引用是否为指定的类型。
多态举例
打个比方 父亲person有行为这个方法,里面包括几个动作:吃饭,睡觉,走路 父亲有三个儿子,三个儿子都继承了父亲的行为方法,所以三个儿子都有吃饭,睡觉,走路这些动作,但是三个儿子又分别有自己的动作–大儿子A会弹吉他,二儿子B会唱歌,三儿子C会打鼓 …
1.Person person = new A(); 不是父类对象指向子类引用而是父类引用指向子类对象
2.这个对象不能调用子类A特有的弹吉他方法–person.guitar(); X
3.如果仅是这么写程序,还不是多态,记住实现多态的三要素:继承 重写 父类引用指向子类对象
4.之后,如果你调用person.guitar(),此时在代码的编译阶段,persion调用的仍然是自己的guitar(),不是儿子的。而当程序运行时,就是java XXX, persion调用的却是儿子的guitar()。这个动态的过程才是多态 。
抽象类的写法和作用范围
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更通用。
类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。
抽象方法:只有方法的声明,没有方法的实现。以分号结束。
abstract int abstractMethod1( int a );
含有抽象方法的类必须被声明为抽象类。
抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。或
Abstract不能用来修饰属性、构造器、private、static、final。
abstract class A{
abstract void m1( );
public void m2( ){
System.out.println("A类中定义的m2方法");
}
}
class B extends A{
void m1( ){
System.out.println("B类中定义的m1方法");
}
}
public class Test{
public static void main( String args[ ] ){
A c = new B( );
c.m1( );
c.m2( );
}
}
抽象类VS一般类
相同点:
抽象类和一般类都是用来描述事物的,都在内部定了成员。
不同:
一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足。
一般类中不能定义抽象方法,只能定非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。
一般类可以被实例化。抽象类不可以被实例化。
注意:
不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法
/抽象类
public abstract class Animal {
int leg;
//抽象类有构造器 (凡是类都有构造器)
public Animal() {
}
//抽象类有构造器 (凡是类都有构造器)
public Animal(int leg)
{
this.leg =leg;
}
abstract void eat();//抽象方法
}
抽象类中可以没有抽象方法。
抽象方法所在的类,一定是抽象类。
抽象类可以被继承,不能被实例化
抽象类应用
抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。
解决方案
Java允许类设计者指定:超类声明一个方法但不提供实现,该方法的实现由子类提供。这样的方法称为抽象方法。有一个或更多抽象方法的类称为抽象类。
Vehicle是一个抽象类,有两个抽象方法。
public abstract class Vehicle{
public abstract double calcFuelEfficiency(); //计算燃料效率的抽象方法
public abstract double calcTripDistance(); //计算行驶距离的抽象方法
}
public class Truck extends Vehicle{
public double calcFuelEfficiency( ) { //写出计算卡车的燃料效率的具体方法 }
public double calcTripDistance( ) { //写出计算卡车行驶距离的具体方法 }
}
public class RiverBarge extends Vehicle{
public double calcFuelEfficiency( ) { //写出计算驳船的燃料效率的具体方法 }
public double calcTripDistance( ) { //写出计算驳船行驶距离的具体方法}
}
注意:抽象类不能实例化 new Vihicle()是非法的
接口
我们对电脑已经非常熟悉了,众所周知,电脑具有拍照和播放光碟的功能。现在有一个TakingPhoto类,它提供拍照的功能;还有一个PlayVCD类,它提供了播放光碟的功能。电脑同时具有这两个类的提供的功能。因此我们希望定义一个Computer类,继承TakingPhoto和PlayVCD类。但此时问题就出现了 java中是不允许多重继承的!!!
为了解决这个问题,Java提出了接口的方式,作为“替代版”的多重继承。在这里我们将讨论如何定义和实现一个接口,并对比接口和抽象类,帮助大家理解它们之间的区别
接口–什么是接口
接口可以理解为对一组方法声明进行的统一命名,但这些于方法没有提供任何实现。也就是说。,把一组方法声明放在在一个接口中,然后继承该接口的类都需要实现这些方法
通过接口,你可以对方法进行同一管理,继承接口的类只需实现这些方法就可以了。
假如,一个选课系统,可以将对用户的管理的方法声明放到一个接口里;对课程的管理的方法声明放到一个接口里。
只需用类来继承这些接口并实现就可以了。
接口的作用
可以实现不同类的相同行为,不需要考虑类之间的层次关系;
可以指明多个类需要实现的方法;
可以使处于不同层次甚至互不相关的类具有相同的行为。
接口举例
假设有类Airplane,Bird,Superman,这些类之间并没有继承关系也不一定处于相同的层次上,但他们可以拥有共同的方法takeoff( )、fly( )、land( )。
那就可以定义一个接口Ifly,接口中有三个方法成员,上述三个类都可以继承自该接口,即他们都有相同的三个方法。
接口
有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
接口(interface)是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
实现接口类:
class SubClass implements InterfaceA{ }
一个类可以实现多个接口,接口也可以继承其它接口。
接口的特点:
用interface来定义。
接口中的所有成员变量都默认是由public static final修饰的。
接口中的所有方法都默认是由public abstract修饰的。
接口没有构造器。
接口采用多继承机制。
接口定义举例
如何定义接口
在java中定义类使用关键字class,定义接口使用关键字interface
interface InterfaceA{ }
**如何实现接口**
在java中继承类使用关键字extends,实现接口使用关键字implements
class SubClass implements InterfaceA{ }
一个类可以实现多个接口
class SubClass extends SuperClass implements InterfaceA, InterfaceB{ }
接口的实例
interface Runner {public abstract void run();}
interface Swimmer {void swim();}
interface Flier {void fly();}
class Duck implements Runner, Swimmer, Flier {
@Override
public void fly() {System.out.println("丑小鸭也可以变成白天鹅!");}
@Override
public void swim() {System.out.println("红掌拨清波");}
@Override
public void run() {System.out.println("鸭子屁股扭扭的走路");}
}
接口多继承
接口与接口之间是继成关系,使用extends关键字,而且接口可以多继承
interface InterfaceA extends InterfaceB { }
接口总结
通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
通过接口可以指明多个类需要实现的方法,一般用于定义对象的扩张功能。
接口主要用来定义规范。解除耦合关系。
抽象类VS接口
相同点:
接口和抽象类都不能被实例化。只能被其他类实现和继承。
接口和抽象类都可以包含抽象方法,实现接口和抽象类的类都必须实现这些抽象方法,否则实现的类就是抽象类。
不同点:
抽象类与接口定义不同:抽象类abstract class ,接口 interface
接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通的方法。
接口里不能定义静态方法;抽象类可以定义静态方法
接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性,也可以定义静态常量
接口不包含构造函数;抽象类可以包含构造函数,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。
接口不包含初始化块,但抽象类可以包含初始化块
一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java的单继承不足