继承extends (特点、重写、覆盖、应用)抽象abstract(定义、特点、细节)

一 继承:

在java中,在现有的类中新建一个类叫子类,现有的类叫父类,子类自动拥有父类所有可继承的属性和方法。关键字 extends  Java 只支持单继承

格式:

class 子类 extends 父类 { }

package com.oracle.Demo01;
//这是一个父类
public class Developer {
    String name;
    public void speak(){
        System.out.println(name+"父类正在工作");
    }
}
-------------------------------------------------------
package com.oracle.Demo01;
//子类 
public class JavaEE extends Developer{
    public void print(){
        System.out.println(name+"子类在写JavaEE代码");        
    } 
}
---------------------------------------------------------
package com.oracle.Demo01;
//新建Android类
public class Andriod extends Developer{
    public Andriod() {
        System.out.println("这是安卓里面添加的内容 ");
    }
}
---------------------------------------------------------
package com.oracle.Demo01;
//测试类
public class Demo01 {
    public static void main(String[] args) {
        JavaEE java=new JavaEE();
        java.name="钢铁侠";
        java.speak();
        java.print();
        
        Andriod an=new Andriod();
        an.name="小辣椒";
        an.speak();
    }
}

 

继承的好处和注意事项

好处:1.提高代码复用性  2.产生关系
1.java里,类只支持单继承

 class A{}

    class B{}

     class C extends A,B{}  // C类不可以同时继承A类和B类

2.多个类可继承一个父类  一个父亲多个儿子

class A{}

 class B extends A{}

 class C extends A{}   // 类B和类C都可以继承类A

3.多层继承:爷孙关系

class A{}

class B extends A{}   // 类B继承类A,类B是类A的子类

class C extends B{}   // 类C继承类B,类C是类B的子类,同时也是类A的子类

 

package com.oracle.Demo02;
//父类
public class Fu {
    int a=1;
    public void show(){
        System.out.println("这是父类的方法");
    }
}
----------------------------------------------------------------
package com.oracle.Demo02;
//子类
public class Zi extends Fu{
    int a=2;
    public void get(){
        int a=3;
        System.out.println(a);//3 就近原则
        System.out.println(this.a);//2  用this就等于本类了
        //super:父类对象
        //注意:this 和super 只能在子类里面使用
        System.out.println(super.a);
    }
    public void show2(){
        System.out.println("这是子类的方法");
    }
}
--------------------------------------------------------------------
package com.oracle.Demo02;
//测试类
public class Demo01 {
    public static void main(String[] args) {
        //继承中子父类有同名变量时,如果子类自己有,用自己的,如果子类没有,用父类的
        Zi zi=new Zi();
        System.out.println(zi.a);
        zi.show();//调用子类的show方法 ,子类里面没有show,子继承了父的show,测试打印子里的show就等于是调用了父类的show
        zi.show2();//调用子类的show2方法
    }
}

 

 

方法重写:有继承关系前提下,子类中有跟父类,返回值,方法,个数一模一样

package com.oracle.Demo03;
//这是父类
public class Phone {
    public void show(){
        System.out.println("显示电话号码");
    }
    public void sendMssage(){
        System.out.println("发短信");
    }
    public void call(){
        System.out.println("打电话");
    }
}
-------------------------------------------------------
package com.oracle.Demo03;
//子类
public class Iphone extends Phone{
//用super调用父类
public void show(){ super.show(); System.out.println("显示来电姓名"); System.out.println("显示头像"); } } -------------------------------------------------------- package com.oracle.Demo03; //测试 用继承和方法重写的 public class Demo01 { public static void main(String[] args) { Iphone iphone =new Iphone(); iphone.show(); iphone.call(); iphone.sendMssage(); } }

 l  成员方法特殊情况——覆盖

子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为override重写、复写或者覆盖。

 ①子类覆盖方法:必须要保证权限大于等于父类权限

4个修饰符的大小关系  :public  protected default private

 PM

二、抽象类:

1、含义:方法功能声明相同,方法功能主体不同。这时抽取方法声明,不抽取方法主体。此方法就是一个抽象方法。此方法的类就是抽象类。

2、抽象类及抽象方法的定义:

abstract class 类名 {}
public abstract 返回值类型 方法名(参数);
package com.oracle.Demo04;
//图形类 
//抽象类里不一定包含抽象方法,但有抽象方法的类一定是抽象类
public abstract class Huge {
    //声明一个抽象方法体
    public abstract double getArea();
  //抽象类里可以写普通方法
public void show(){ System.out.println("这是一个图形"); } } ---------------------------------------------------------- package com.oracle.Demo04; //子体 圆形 //继承一个抽象类,必须要重写 ,如果不想重写就在class前面加abstract,否则报错 public class Circle extends Huge{ //圆形半径 double r; //不加abstract就要重写huge里的方法 如下 @Override //override 重写标记(可删可不删) public double getArea() { double area=2*r*Math.PI; return 0; } } ------------------------------------------------------- package com.oracle.Demo04; //测试 public class Demo01 { public static void main(String[] args) { //声明一个Circle对象 Circle c=new Circle(); c.r=2; double area=c.getArea(); System.out.println("面积为:"+area); } }

 3、特点:

①、抽象类、方法都要abstract 修饰

②、有抽象方法的类一定是抽象类

③、抽象类不一定包含抽象方法,也可有普通方法

public  abstract class Huge {
    public abstract double getArea();//抽象方法 public void show(){ //普通方法 System.out.println("这是一个图形"); } }

④、抽象类不能new,重写所有方法,成为普通方法,才可以new

⑤、抽象类一定是父类;

⑥、抽象类是子类的父类,把共有的属性抽取出来。子类覆盖了父类所有的抽象方法,子类才能创建对象。否则子类还是个抽象类。

⑦、abstract 和 private 不能共存:private:私有的方法无法继承,也不存在覆盖

练习:

package com.oracle.Demo05;
//建一个公共的抽象类 员工
public abstract class Emp {
    //封装 属性
    private int eid;
    private String ename;
    public int getEid() {
        return eid;
    }
    public void setEid(int eid) {
        this.eid = eid;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    //声明一个抽象的方法
    public abstract void work();
}
-------------------------------------------------------
package com.oracle.Demo05;
//研发 继承抽象员工类
public abstract class Yanfa extends Emp{
}
------------------------------------------------------
package com.oracle.Demo05;
//抽象类继承Emp
public abstract class Weihu extends Emp{    
}
------------------------------------------------------
package com.oracle.Demo05;
//继承Yanfa类  
public class JavaEE extends Yanfa{
    //重写里面方法
    @Override
    public void work() {
        System.out.println("姓名为"+getEname()+"工号为"+getEid()+"的员工正在写javaEE代码");        
    }
}
--------------------------------------------------
package com.oracle.Demo05;
//安卓类继承研发类
public class Andriod extends Yanfa{
    public void work() {
        System.out.println("姓名为"+getEname()+"工号为"+getEid()+"的员工正在写Andriod代码");        
    }
}
-----------------------------------------------------
package com.oracle.Demo05;
//网络工程师继承维护类
public class Network extends Weihu{
    //重写weihu类的方法
    public void work() {
        System.out.println("姓名为"+getEname()+"工号为"+getEid()+"的员工正在维护网络");        
    }
}
----------------------------------------------------
package com.oracle.Demo05;
//硬件继承维护类
public class HardWare extends Weihu{
    //重写weihu的方法
    public void work() {
        System.out.println("姓名为"+getEname()+"工号为"+getEid()+"的员工正在维护硬件");
    }
}
---------------------------------------------------
package com.oracle.Demo05;
//测试
public class Demo01 {
    public static void main(String[] args) {
    //创建JavaEE员工
    JavaEE j=new JavaEE();
    j.setEid(1);
    j.setEname("张三");
    //j调用work方法
    j.work();
    //创建安卓员工
    Andriod a=new Andriod();
    a.setEid(2);
    a.setEname("李四");
    a.work();
    //创建网络员工
    Network n=new Network();
    n.setEid(3);
    n.setEname("小红帽");
    n.work();
    }
}

打印的结果    

作业:

根据需求,完成如下代码(使用抽象类、按照标准格式写),并在测试类中进行测试。
    需求一:
        具体事物:基础班老师,就业班老师
        共性:姓名,年龄,讲课。
        特性:
            基础班老师讲JavaSE
            就业班老师讲Android

    需求二:
        具体事物:基础班学生,就业班学生
        共性:姓名,年龄,学习
        特性:
            基础班学生学JavaSE
            就业班学生学Android

    需求三:
        已知猫类和狗类:
            属性:毛的颜色,腿的个数
            行为:吃饭
            猫特有行为:抓老鼠catchMouse
            狗特有行为:看家lookHome

写代码

package zuoye;
//定义一个公共的抽象的老师类
public abstract class teacher {
    //封装
    private String name;
    private int age;
    private String jiangke;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getJiangke() {
        return jiangke;
    }
    public void setJiangke(String jiangke) {
        this.jiangke = jiangke;
    }
    //创建一个抽象的方法
    public abstract void work();
}
-----------------------------------------------------------
package zuoye;
//让基础老师继承teacher类
public class jc extends teacher{
    public void work(){
        System.out.println("姓名为:"+getName()+"年龄为:"+getAge()+"岁"+getJiangke());
    }
}
-------------------------------------------------------------
package zuoye;
//就业老师继承teacher
public class jy extends teacher{
    public void work(){
        System.out.println("姓名为:"+getName()+"年龄为:"+getAge()+"岁"+getJiangke());
    }
}
-------------------------------------------------------------
package zuoye;
//定义学生父类
public abstract class student {
    //封装属性
    private String sname;
    private int sage;
    private String study;
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public int getSage() {
        return sage;
    }
    public void setSage(int sage) {
        this.sage = sage;
    }
    public String getStudy() {
        return study;
    }
    public void setStudy(String study) {
        this.study = study;
    }
    //建一个抽象的方法
    public abstract void xuexi(); 
}
------------------------------------------------------
package zuoye;
//让基础班继承student类
public class jcstu extends student{
    public void xuexi() {
        System.out.println("姓名为:"+getSname()+"年龄为:"+getSage()+"岁"+getStudy());
    }
}
---------------------------------------------------
package zuoye;
//让就业班继承student
public class jystu extends student{
    public void xuexi() {
        System.out.println("姓名为:"+getSname()+"年龄为:"+getSage()+"岁"+getStudy());        
    }
}
------------------------------------------------------
package zuoye;
//定义一个动物 父类
public abstract class animal {
    //封装属性
    private String color;
    private int tui;
    //private String eat;
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getTui() {
        return tui;
    }
    public void setTui(int tui) {
        this.tui = tui;
    }
    //新建个抽象的方法
    public abstract void eat();
}
--------------------------------------------------------
package zuoye;
//让狗继承animal类
public class dog extends animal{
    public void eat(){
        System.out.println("一只颜色为:"+getColor()+","+"拥有"+getTui()+"条腿的狗狗,在进食");
    }
    //新建个特有的方法
    public void lookhome(){
        System.out.println("狗狗特有的行为就是看家");
    }
}
--------------------------------------------------------
package zuoye;
//让猫类继承animal类
public class mao extends animal{
    public void eat(){
        System.out.println("一只颜色为:"+getColor()+","+"拥有"+getTui()+"条腿的猫咪,在进食");
    }
    //新建个特有的方法
    public void catchMouse(){
        System.out.println("猫特有的行为就是捉老鼠");
    }
}
-----------------------------------------------------------
最后 测试一下 
package zuoye;
//测试
public class Demo01 {
    public static void main(String[] args) {
    //创建基础班
    jc j=new jc();
    j.setAge(30);
    j.setName("基础老师,");
    j.setJiangke("在讲JavaSe");
    j.work();
    //创建就业班
    jy a=new jy();
    a.setAge(18);
    a.setName("就业老师,");
    a.setJiangke("在讲Andriod");
    a.work();
    //创建基础班的学生
    jcstu jcs=new jcstu();
    jcs.setSname("基础学生,");
    jcs.setSage(10);
    jcs.setStudy("在学JavaSE");
    jcs.xuexi();
    //创建就业班的学生
    jystu jys=new jystu();
    jys.setSname("就业学生,");
    jys.setSage(18);
    jys.setStudy("在学Andriod");
    jys.xuexi();
    //创建狗
    dog d =new dog();
    d.setColor("骚黑色");
    d.setTui(4);
    d.eat();
    d.lookhome();
    //创建猫
    mao m=new mao();
    m.setColor("骚白色");
    m.setTui(4);
    m.eat();
    m.catchMouse();
    }
}

打印的结果:

转载于:https://www.cnblogs.com/zs0322/p/10879611.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1关:继承及方法重写 继承是面向对象编程中的一种重要的概念,它允许我们创建一个新类,从现有的类中继承属性和方法。子类可以继承父类中的公共方法和属性,并且可以重写父类中的方法来实现自己的功能。 方法重写是指子类重写父类中已经存在的方法。子类可以根据自己的需要重新定义一个父类中的方法,使其具有不同的行为。在子类中重写方法时,方法名、参数列表、返回类型必须与父类中被重写的方法完全相同。 例如,我们创建一个父类Animal和一个子类Dog,子类Dog继承了父类Animal中的属性和方法,并且重写了其中的方法: ```java public class Animal { private String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + " is eating."); } } public class Dog extends Animal { public Dog(String name) { super(name); } @Override public void eat() { System.out.println("The dog is eating bones."); } } ``` 在上面的例子中,我们定义了一个Animal类,它有一个属性name和一个方法eat,然后我们创建了一个Dog类,它继承了Animal类,并且重写了eat方法。在Dog类中的eat方法中,我们打印出了一条狗在吃骨头的语句。 2关:抽象抽象类是一种特殊的类,它不能被实例化,只能被继承抽象类中可以包含抽象方法和具体方法。抽象方法是一种没有实现的方法,它只有方法的声明,没有方法体,而具体方法则是有实现的方法。 抽象类通常用于定义一些抽象的概念,它可以被子类继承并实现。抽象类不能被实例化,只能被用作父类。 例如,我们可以定义一个抽象类Animal,其中包含一个抽象方法eat: ```java public abstract class Animal { private String name; public Animal(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void eat(); } ``` 在上面的例子中,我们定义了一个抽象类Animal,其中包含了一个抽象方法eat,它没有方法体,只有方法的声明。这个抽象类不能被实例化,只能被继承。 3关:接口及实现类定义 接口是一种规范或者一种约定,它定义了一个类应该做什么,但并不规定类应该怎么做。接口中只包含方法的声明,没有方法的实现,它是一种纯粹的抽象概念。 实现类是实现接口的类,它们必须实现接口中的所有方法。实现类可以实现多个接口,这样就可以同时具有多种功能。 例如,我们可以定义一个接口Animal,其中包含一个方法eat: ```java public interface Animal { void eat(); } ``` 在上面的例子中,我们定义了一个Animal接口,其中只包含一个方法eat,没有方法的实现。这个接口可以被其他类实现。 然后我们可以创建一个实现类Dog,它实现了Animal接口: ```java public class Dog implements Animal { @Override public void eat() { System.out.println("The dog is eating bones."); } } ``` 在上面的例子中,我们创建了一个实现类Dog,它实现了Animal接口中的eat方法,并且实现了自己的功能,即打印出一条狗在吃骨头的语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值