----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
抽象方法:多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。
抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。
1,抽象方法一定在抽象类中。抽象方法和抽象类都必须被abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2,抽象方法只定义方法声明,并不定义方法实现。
3,抽象类不可以用new创建对象(实例化)。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用(继承),必须由子类复写起所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。即只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。
1,抽象类有构造函数,用于子类对象初始化
2,抽象关键字abstract和final ,private , static不可以共存
3,抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
4,抽象类中有构造函数,抽象类是一个父类,可以给子类提供实例初始化
我们在开发一个系统时需要对员工进行建模,员工包含3个属性:姓名,工号以及工资,经理也是员工,除了含有员工的属性外,另外还有一个奖金属性,请使用继承的思想设计出员工类和经理类,要求类中提供必要的方法进行属性访问。
class Employee
{
private String name;
private String id;
private double pay;
Employee(String name,String id,double pay)
{
this.name = name;
this.id = id;
this.pay = pay;
}
public abstract void work();
}
class Manager extends Employee
{
private int bonus;
Manager(String name,String id,double pay,int bonus)
{
super(name,id,pay);
this.bonus = bonus;
}
public void work()
{
System.out.println("manager work");
}
}
class Pro extends Employee
{
Pro(String name,String id,double pay)
{
super(name,id,pay);
}
public void work()
{
System.out.println("pro work");
}
}
class
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
abstract class GetTime
{ //获取某段时间的代码,其中runcode();是不确定的,暴露到外边去。其他的是确定的。
public final void getTime()//此功能如果不需要复写,可加final限定
{
long start = System.currentTimeMillis();
runcode();//不确定的功能部分,提取出来,通过抽象方法实现
long end = System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}
public abstract void runcode();//抽象不确定的功能,让子类复写实现
}
class SubTime extends GetTime
{
public void runcode()//子类复写功能方法
{
for(int x=0; x<4000; x++)
{
System.out.print(x);
}
}
}
class TemplateDemo
{
public static void main(String[] args)
{
//GetTime gt = new GetTime();
SubTime gt = new SubTime();
gt.getTime();
}
}
-------------------------------------------------------------------------------------------------------------------
可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。接口看上去是一个特殊的抽象类。里面存的都是抽象方法。
interface Innter{}
修饰常量:public static final
修饰方法:
public abstract interface Inter
{
public static final intNUM = 3;
public abstract void show();
}
接口中成员是共有的,一个类可以继承类的同时实现多个接口,接口允许多继承
interface A
{
void methodA();
}
interface B extends A
{
void methodB();
}
interface C extends B
{
void methodC();
}
class D implements C
{
public void methodA(){}
public void methodC(){}
public void methodB(){}
}//建立D的对象必须实现3个方法。 接口之间可以多继承。Java支持多继续,只有接口之间有多继承 。类之间是单继承
1:接口是对外提供的规则。
2:接口是功能的扩展。
3:接口的出现降低了耦合性
------------------------------------------------------------------------------------------------------------
1,多态的体现
父类的引用指向了自己的子类对象。Animal a = new Cat();
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖操作。
3,多态的好处
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)即:提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5,多态的出现思想上也做着变化:以前是创建对象并指挥对象做事情。有了多态以后,我们可以找到对象的共性类型,直接操作共性类型做事情即可,这样可以指挥一批对象做事情,即通过操作父类或接口实现。
代码范例:
abstract class Animal
{
abstract void eat();
}
class Cat extends Animal
{
public void eat()
{
System.out.println("吃鱼");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨头");
}
public void kanJia()
{
System.out.println("看家");
}
}
class Pig extends Animal
{
public void eat()
{
System.out.println("饲料");
}
public void gongDi()
{
System.out.println("拱地");
}
}
判断对象是否实现了指定的接口或继承了指定的类
格式:
对象 instanceof类型
Student instanceof Person = true;//student继承了person类
多态在子父类中的成员上的体现的特点:
1,成员变量:在多态中,子父类成员变量同名。
在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
运行时期:也是参考引用型变量所属的类中是否有调用的成员。
简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
再说的更容易记忆一些:成员变量---编译运行都看 =左边。
2,成员函数。
编译时期:参考引用型变量所属的类中是否有调用的方法。
运行时期:参考的是对象所属的类中是否有调用的方法。
为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
更简单:成员函数 --- 编译看 =左边,运行看 = 右边。
3,静态函数。
编译时期:参考的是引用型变量所属的类中是否有调用的成员。
运行时期:也是参考引用型变量所属的类中是否有调用的成员。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
详情请查看:http://edu.csdn.net/heima