• 继承


    一、继承

    继承就是子类继承父类可以继承的属性和方法。

    如何确定子父类,父类是子类的共同点集合,通过一层层寻找共性确定父类,父类位于顶部地位。

    设计继承是由下往上,写代码是从上往下

    二、继承的格式extends

    class 子类 extends 父类
     三.继承的好处

    1、继承的出现提高了代码的复用性,提高软件开发效率。

    2、继承的出现让类与类之间产生了关系,提供了多态的前提。

    java只支持单继承,如父类a,b,子类c只能单继承a,b其中一个

    java多个子类能继承一个父类,如子类a,b能够继承父类c

    java支持多层继承,如a可以继承b也可以成为c的父类

    Object是祖宗类,这里面不需要写extends

    四、继承的成员变量重名的解决

    如封装是this来调取本类对象,继承中也可以用this(本类中使用),更重要的是supper(子类中调取父类变量).成员变量(只是把父类成员变量调取过去)

    ①super只能写在子类中
    ②this子类父类都可
    两者调取的都是类中的方法和属性
    this,super都写在方法名中
    子类都可以用super
    注意:
    假如说子类私有,父类是无法访问的

    子类和父类出现同名成员变量时,
            如果子类有,调子类的,如果子类没有,掉父类,就近原则
    例如:

    public class Fu {
        //创建父类成员变量
        int i=1;
    } public class Zi extends Fu{
        int  i=2;
        public void show(){
            //就近原则
            //子类成员变量
            int i=3;
            System.out.println(i);  //3 =就近原则=局部变量
            System.out.println(this.i);  // 本类的成员变量 =this.i     =2
            System.out.println(super.i); //1 父类对象只能存在在子类中,可以跨子父类调取=父类的i=1
            }
        public static void main(String[] args) {
            //创建子类对象
            Zi z=new Zi();
            System.out.println(z.i); //2 调取本类中的成员变量i

     五.方法重写:

    方法重写是子类重写父类,如果子类没有则调取父类方法,如果父类和子类出现一模一样的方法,则是特殊情况覆盖。

    方法重写的好处是即继承了父类的元素,又有子类特有的元素

    1:在子父类中2、出现一样方法声明,出现覆盖重写

       写法上稍微注意:必须一模一样:方法的返回值类型 方法名 参数列表都要一样。

    如:

    父类
    public class Fu {
        //创建父类成员变量
        int i=1;
        //方法的重写
        public void eat(){
            System.out.print("爸爸吃饭");
        }
    
    子类
    public void eat(){
            //调取父类方法联合自己的方法,父类对象名.方法名();
            super.eat();
            System.out.println("儿子吃肉");
            
        }
    
    测试:
    public class Cs_fu {
        public static void main(String[] args) {
            z.show();
            //2  1
            //方法重写1:、在子父类中2、出现一样方法声明,出现覆盖重写
            //调取子类中的eat
            z.eat();//方法重写从父类先走,相当于将父类+子类的方法放到了一起
        }

    六:抽象类:abstarct

    方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。(总感觉是一个中转作用)
    抽象类一般是父类,说不明白的东西,不能new对象
    抽象类中可以不放抽象类,但抽象类一定要放在抽象方法中
    抽象类中可以放变量,后面可以继承
    抽象方法只能有方法名,没有方法体,只能作为继承出现,就是为了继承出现的。
    必须要把抽象类全部重写带上方法体,子类才可以创建对象,

    注意:
    抽象关键字abstract不可以和哪些关键字共存。
    private:私有的方法子类是无法继承到的,也不存在覆盖,
    而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。
    final修饰的不能被修改。静态修饰符static不进堆栈,直接在静态方法区就开始运行。

    例如:

    原先用封装需要将员工中的员工名字,性别提取到父类中,但是研发部员工和维护部员工就空出来没有作用,而我们学习继承抽象之后就可以利用继承不停的向上提取共性,确定员工中的名字和性别并提取到研发部和维护部中,但是抽象告诉我们可以只在这里面定义两个抽象类姓名和性别,不需要一个一个定义方法,后面子类只需要继承抽象类,重写方法从而在子类调取父类元素进行输出。

    代码如下:

    //抽象父类 研发部员工
    package com.oracle.demo04;
    //抽象方法一定在抽象类里,抽象类不一定是抽象方法
    //抽象类研发部员工
    public abstract class Developer {抽象类书写格式
        int  did;
        String dname;
        //没有方法体,抽象方法
        public abstract void work(); 抽象方法书写格式
        
    }
    public class JavaEE  extends Developer{ 继承的书写格式
        //重写可以让抽象类变成普通类,子类继承父类,方法名.参数.返回值相同
    //继承普通子类 public void work() { //重写将抽象类变成普通类 System.out.println("工号为"+did+"姓名为"+dname+"的员工正在写Andriod代码"); }
    public class Andriod extends Developer {
    //重写可以让抽象类变成普通类,子类继承父类,方法名.参数.返回值相同 public void work(){ System.out.println("工号为"+did+"姓名为"+dname+"的员工正在写javaEE代码"); }
    //抽象父类 研发部员工
    package com.oracle.demo04;
    //抽象方法一定在抽象类里,抽象类不一定是抽象方法
    //抽象类研发部员工
    public abstract class Developer {
        int  did;
        String dname;
        //没有方法体,抽象方法
        public abstract void work();
        
    }
    //继承普通子类
    public void work() {
            //重写将抽象类变成普通类
                System.out.println("工号为"+did+"姓名为"+dname+"的员工正在写Andriod代码");
        }
    //重写可以让抽象类变成普通类,子类继承父类,方法名.参数.返回值相同
        public void work(){
            System.out.println("工号为"+did+"姓名为"+dname+"的员工正在写javaEE代码");
        }
    测试:
        public static void main(String[] args) {
            JavaEE java =new JavaEE();
            java.did=123;
            java.dname="小红帽";
            java.work();
            Andriod an=new Andriod();
            an.did=456;
            an.dname="灰色";
            an.work();

    结果:


    六.二接口:interface
    它仍然是特殊类,只能写抽象类,使用interface关键字,仍是class文件,是继承的一个表现形式。
    是一个功能的集合,作为一个公共访问的抽象方法,解决继承外额外的功能,只描述方法,不实现
    定义格式:
    public interface 接口名{
    抽象方法1;
    抽象方法2;
    抽象方法3;
    }
    类继承类extends==继承 class zi extends fu 继承
    类实现接口==implements类实现接口  class zi implement eat 实现接口

    接口接口是继承关系==extends  zi implement eat 互为继承

    实现接口后,将接口中的所有抽象方法继承
    接口弥补java的单继承,普通学生类实现学生中有烟喝酒接口类,先继承后实现
    public class Student implements  preson Smoking,Drink

    接口中成员特点
    1.接口中可以定义常量:
    必须要有特定的修饰符public static final ,就算是不写,也是静态常量,后面不能更改
        静态常量
        static:用类名.变量名 去访问取值 class.farnaml
        final:一次赋值,终身不变,必须赋值
        public static final int a=1;

    2、接口中可以定义方法,方法也有固定的修饰符,public abstract void eat();

    3、接口不可以创建对象。不可以new对象

    4子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。


    接口的多继承:弥补了java不能多继承。
    接口可以多继承,java不能多继承

    package com.oracle.demo05;
    //类实现接口
    //类继承类extends关系继承,当类和接口的时候implements类实现接口,接口接口是继承关系继承
    //接口弥补java的单继承,普通学生类实现吸烟喝酒接口功能,挑选出坏学生
    //public class Student implements  preson Smoking,Drink
    public class Student implements Smoking,Drink{
        public void smoke() {
            //常量是固定的,不能在子类中修改
            //Smoking.a=5;
            System.out.println("学生抽烟");
        }
        public void drink() {
            //Smoking.a=5;
            System.out.println("学生抽烟");
        }     
    }
    package com.oracle.demo05;
    //类实现接口
    //类继承类extends关系继承,当类和接口的时候implements类实现接口,接口接口是继承关系继承
    //接口弥补java的单继承,普通学生类实现吸烟喝酒接口功能,挑选出坏学生
    //public class Student implements  preson Smoking,Drink
    public class Student implements Smoking,Drink{
        public void smoke() {
            //常量是固定的,不能在子类中修改
            //Smoking.a=5;
            System.out.println("学生抽烟");
        }
        public void drink() {
            //Smoking.a=5;
            System.out.println("学生抽烟");
        }    
    }
    //接口  ==喝酒的共同集合
    public interface Drink {
        //接口里面只能放抽象方法
        public abstract void drink();
        //public static final 就算是不写,也是静态常量
        //静态常量
        //static:用类名.变量名去访问取值
        //final:一次赋值,终身不变,必须赋值
        public static final int a=1;
        //public abstract 已经定义好
        //定义抽象方法
            public abstract void smoke();


    5.抽象类和接口的区别:
    抽象类可以有普通方法,接口只能包含抽象方法
    一个类只能继承一个直接父类,但可以实现多个接口(弥补单继承)
    必须要重写,否则子类是抽象类
    抽象类继承父类具有的功能和方法,接口是实现额外的功能
    接口的作用:
    接口降低了耦合性,为设备和设备之间进行了解耦
    接口和抽象类是继承类的内容
    接口拓展了功能

  • 相关阅读:
    软件工程实践2017第一次作业
    mysql卸载重装总是卡在starting server这一选项
    java web出现的问题
    c#中对文件进行解压同时进行解压后的数据操作
    添加debug里面的图片进行打印
    如何创建一个button控件,进行资源选择
    使用Graphics.DrawString如何实现textBox换行打印
    很有意思的一种两个数交换的方法
    将一个字符串进行反转;获取一个字符串在另一个字符串中出现的次数;获取两个字符串中最大相同子串。
    Comparator匿名实现
  • 原文地址:https://www.cnblogs.com/a199706/p/11294312.html
Copyright © 2020-2023  润新知