java基础--继承,抽象,接口

来源:互联网 发布:linux arp 老化时间 编辑:程序博客网 时间:2024/05/15 04:36

第一部分 继承
一、概述
继承是面向对象的一个重要特征。当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继那个类即可。这时,多个类可以称为子类,单独的这个类称为父类或者超类。例如:猫和豹子都是猫科动物,那么就可以说描述猫这个对象创建的类,是子类;而描述猫科动物这个对象创建的类,就是父类。
这样类与类之间就存在了继承的关系。子类可以直接访问父类中的非私有的属性和行为。在代码中通过extends关键字表示继承关系。例:
class Sonextends Father{} //这也是在代码中的书写格式。
注意:千万不要为了获取其他类中的功能,简化代码而继承。必须是类与类之间有所属关系才可以继承。这种所属关系的表示为is a。

二、特点
1、提高了代码的复用性。
2、让类与类之间产生了关系。有了这个关系,提供了多态的前提。
注:Java语言中,只支持单继承,不支持多继承。例:一个儿子只能有一个父亲。
原因:因为类与类多继承的话,容易带来安全隐患。如:当多个父类中定义了相同功能,当功能内容不同时,子类对象不确定要运行哪个一个。
但是Java保留了这种机制,并用另一种体现形式来完成。叫多实现。

三、继承的应用
Java类中虽然不支持多继承,但可以多层继承。也就是一个继承体系。如儿子继承父亲,父亲继承爷爷等。用代码体现就是:
class A{}
class B extendsA{}
class C extendsB{}
那么如何使用一个继承体系中的功能呢?
想要使用体系,先查体系中父类的描述,因为父类中定义的是该体系中的共性功能。通过了解共性功能,就可以知道该体系的基本功能。这样这个体系就可以基本使用了。
在具体调用时,要创建最子类的对象。原因:
一是因为有可能父类不能创建对象。
二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。
简单一句就是:查阅父类功能,创建子类对象使用功能。
示例:

//定义一个人父类class Person{    //名字和年龄是人的共有属性    String name;    int age;    //在构造函数中对名字和年龄进行初始化    Person(String name,int age)    {        this.name=name;        this.age=age;        System.out.println(name+"  "+age);    }    //人都具有睡觉的功能    void sleep()    {        System.out.println("sleep");    }}//定义一个学生,继承人,作为子类class Student extends Person{    Student(String name,int age)    {        super(name,age);    //super关键字表示父类,因为姓名和年龄在父类中进行了初始化动作,在这里可以直接调用    }    //学生具有特有的功能,学习    void study()    {        System.out.println("study");    }}class Demo{    public static void main(String[] args)    {        Student s=new Student("zhangsan",20);        System.out.println(s.name="wangwu");        s.sleep();        s.study();    }}

四、子父类出现后,类成员的特点:
类成员:变量,函数,构造函数。
1、变量
如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this。子类要访问父类中的同名变量,用super。
super的使用和this的使用几乎一致,且两者都存在于方法区中。
this表示本来对象的引用。
super表示父类对象的引用。
2、函数——覆盖
当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内容。如同父类的函数被覆盖一样。这种情况是函数的另一个特性:重写(覆盖)。
当子类继承父类,沿袭了父类的功能,到子类中。但是子类虽具备该功能,但是功能的内容却和父类不一致,这时,没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义,并重写功能内容。子类同时具有父类方法中的内容时,可以用super.方法();
如在上面的示例程序中,如果Student的sleep()功能内容不相同,就可以在本类中,进行重写,而创建对象进行调用时,打印的会是复写之后的内容。
注:1、子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。
2、静态只能覆盖静态。
3、父类中的私有方法不能被重写。
小知识点:
重载:只看同名函数的参数列表。
重写:子父类方法要一模一样。

3、构造函数。
在对子类对象进行初始化时,父类的构造函数也会运行。那是因为子类的每一个构造函数默认第一行有一条隐式的语句super();
super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super();
为什么子类一定要访问父类中的构造函数。
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。在上面的示例中已经有了很好的体现。
注:super语句一定定义在子类构造函数中的第一行。
构造函数结论:
子类的所有构造函数,默认都会访问父类中空参数的构造函数。因为子类每一个构造函数内的第一行都有一句隐式super();当父类中没有空参数的构造函数时,子类必须手动通过supe语句或者this语句形式来指定要访问的构造函数。当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。
小知识点:
为什么this()和super()不能在同一个构造函数中?
因为它两不能在同一行。
为什么不能再同一行?
因为初始化动作要先做。在子类构造函数中必有一个thi语句或者super语句。
知识点:final关键字
继承的出现,打破了对象的封装性,使得子类可以随意复写父类中的功能。这也是继承的一大弊端。那么怎么解决这个问题呢?这里就引出了一个新的关键字——final(最终)。
final作为一个修饰符。具有以下特点:
1、可以修饰类、函数、变量。
2、被final修饰的类不可以被继承。这样就可以避免被继承、被子类复写功能。
3、被final修饰的方法不可以被复写。
4、被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,又可以修饰局部变量。
当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读。而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成,单词间通过_连接。

第二部分 抽象类
一、抽象的定义
抽象就是从多个事物中将共性的,本质的内容抽取出来。
例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。

二、抽象类
Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。
抽象类的由来:
多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。
例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。

三、抽象类的特点
1、抽象类和抽象方法必须用abstract关键字来修饰。
2、抽象方法只有方法声明,没有方法体,定义在抽象类中。
格式:修饰符abstract返回值类型 函数名(参数列表);
3、 抽象类不可以被实例化,也就是不可以用new创建对象。原因如下:
抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。例如:犬科是一个抽象的概念,真正存在的是狼和狗。
而且抽象类即使创建了对象,调用抽象方法也没有意义。
4、抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。
注:抽象类中可以有非抽象的方法。
示例:

/*假如我们在开发一个系统时需要对员工进行建模,员工包含 3 个属性:姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。员工类:name id pay经理类:继承了员工,并有自己特有的bonus。*///员工类,也是父类abstract 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  AbstractDemo {    public static void main(String[] args)     {        new Manager("manager","001",10000,2000).work();        new Pro("pro","020",5000).work();    }}

四、抽象类与一般类的区别
1、抽象类和一般类没有太大的不同。该如何描述事物,还是如何描述事物。只不过,该事物中出现了一些不知道具体内容的方法部分。这些不确定的部分,也是该事物的功能,需要明确出来,但是无法定义主体。通过抽象方法来表示。
2、抽象类比一般类多了个抽象函数。就是在类中可以定义抽象方法。
3、抽象类不可以实例化。
4、抽象类虽然不能创建对象,但是也有构造函数。供子类实例化调用。
注:1、被abstract修饰的函数不能同时被private、final、static修饰。
原因:
final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
private:抽象类中的私有的抽象方法,不被子类所知,就无法被复写。
而抽象方法出现的就是需要被复写。
static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。
可是抽象方法运行没意义。
2、抽象有一个特殊的地方:抽象类中可以不定义抽象方法。这样做可以不让本来实例化,也可以用于模块设计。
示例:

/*需求:获取一段程序的运行时间原理:将程序开始执行到执行结束的时间相减就是程序的运行时间了思路:1、由于想要获取的程序时未知的,可以将其抽象出去,通过子类继承复写的方式获得程序      2、利用java中提供的当前时间功能记录下程序开始执行和执行结束的时间,然后相减*/abstract class  GetTime{    public final void getTime()//加final表示不能被复写    {        long start=System.currentTimeMillis();//开始执行时间        program();        long end=System.currentTimeMillis();//执行结束时间        System.out.println("毫秒"+(end-start));    }    abstract void program();//由于程序不确定,故抽象出去}//要获取执行时间的程序class GetProgram extends GetTime{    void program()    {        for(int x=0;x<1000;x++)            System.out.print(x+" ");    }}class TemplateDemo{    public static void main(String[] args)     {        new GetProgram().getTime();//      System.out.println("Hello World!");    }}

第三部分 接口
一、概述
接口,可以被认为是一个特殊的抽象类。当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。接口使用interface来表示,子类中用implements实现。格式为:
interface 接口名{}
子类名 implements接口名{}
格式特点:
1、接口中常见定义:常量,抽象方法。
2、接口中的成员都有固定修饰符。
常量:public static final
方法:public abstract
3、接口中的成员都是public的。
在使用中,常量可以不写publicstatic final,方法可以不写publicabstract,编译时Java会自动添加这些修饰符,因为这是固定的格式修饰符。但为了方便阅读,通常我们都写上。

二、特点
1、接口是对外暴露的规则。
2、接口是程序的功能扩展。
3、接口的出现降低耦合性。
4、接口可以用来多实现。这也是对多继承不支持的转换形式。java支持多实现。
5、类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
6、 接口与接口之间可以有继承关系。而且可以多继承。
注:1、接口不可以创建对象的,因为有抽象方法。需要被子类实现(implements),子类对接口中的抽象方法全都覆盖后,子类才可以实例化。否则子类是一个抽象类。
2、实现多个接口时,接口中不可以有返回不同类型的同名抽象函数。这样子类实现时将不能复写。

三、接口与抽象类
共性:都是不断向上抽取出来的抽象的概念。
区别:
1、抽象类体现继承关系,一个类只能单继承。
接口体现实现关系,一个类可以多实现。同时接口与接口之间有继承关系。
2、抽象类是继承,是 “is a “关系。
接口是实现,是 “like a”关系。
3、抽象类中可以定义非抽象方法,供子类直接使用。
接口的方法都是抽象,接口中的成员都有固定修饰符。
4、抽象类中可以私有变量或方法。
接口中的常量和方法都是public修饰的权限。
示例:

//抽象学生类abstract class Student{       //抽象的学习方法    abstract void study();    //共性内容非抽象的睡觉方法    void sleep()    {        System.out.println("sleep");    }}//接口,吸烟interface Smoking{    void smoke();}//Zhangsan这个对象继承学生类,实现吸烟接口class Zhangsan extends Student implements Smoking{    //复写学习方法    void study()    {        System.out.println("Zhangsan_study");    }    //复写吸烟方法    public void smoke()    {        System.out.println("Zhangsan_smoking");    }}//Lisi是好学生,不吸烟class Lisi extends Student {       //复写学习方法    void study()    {        System.out.println("Lisi_study");    }}class InterfaceDemo{    public static void main(String[] args)     {        Zhangsan z = new Zhangsan();        z.study();        z.smoke();        new Lisi().study();    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买家地址写错了怎么办 买家写错快递地址怎么办 淘宝退款选择服务类型出不来怎么办 网购东西发错了怎么办 拒签商家不退款怎么办 红米手机无响应怎么办 淘宝网登录密码忘记了怎么办 淘宝网密码忘记了怎么办 京东抢购不发货怎么办 微商不想做了怎么办 减肥过程中饿了怎么办 滴滴车龄超过6年怎么办 网络公选课没过怎么办 大学网络课挂了怎么办 淘宝虚拟订单买家恶意退款怎么办 淘宝卖家虚拟发货怎么办 淘宝买虚拟产品被骗了怎么办 哈尔滨暖气低于十八度怎么办 淘客店铺没人买怎么办 淘宝商家不给退货怎么办 淘宝卖家拒绝退款申请怎么办 运费险赔付少了怎么办 买了运费险退货怎么办 卖家运费险退货怎么办 京东生鲜有坏的怎么办 与上级意见不一致时你将怎么办 物金所倒闭投资怎么办 电商平台欺骗客户怎么办 pdf电脑打开是乱码怎么办 excel表格打开是乱码怎么办 win10安装软件出现乱码怎么办 华为手机速度越来越慢怎么办 oppo手机速度越来越慢怎么办 安卓手机速度越来越慢怎么办 青桔单车忘了锁怎么办 华为手机反应太慢了怎么办 魅族关机键失灵怎么办 oppa79手机开不开机怎么办 黑衣服洗完发白怎么办 白衣服被黑衣服染色了怎么办 评职称单位领导不推荐怎么办