Day6.9继承 重写 super 静态static

继承
1.我们通过关键字extends 建立子类与父类的继承关系,格式:子类extends父类
2.子类继承父类,相当于子类把父类的功能复制了一份
3.父类的私有资源不可用,因为被private修饰不可见
4.java只支持单继承,一个子类只能有一个父类,但一个父类可能有多个子类
5.继承具有传递性,爷爷的功能给爸爸,爸爸的功能给孙子
6.子类可以拥有自己特有的功能,实现功能的拓展
7.继承是 is a的关系,依赖性非常强,强耦合

8.所有的类默认继承Object
===================================================
1.super 是一个关键字
2.super代表的是一个父类的引用,可以看做是 Father super=new Father();
=====================================================
重写:继承后,子类对父类功能不满意,就可以重写
       重写的规则:两同两小
    方法名相同,形参列表相同
    子类方法抛出的异常<=父类方法抛出的异常
    子类方法的返回值类型<=父类的返回值类型
    权限修饰符>=父类的权限修饰符
TIPS 子类无权修饰父类的私有方法
======================================================
继承之变量
继承之构造方法
1.子类创建对象时,会优先调用父类的构造方法
2.在子类构造器中,第一行默认存在super空,表示调用父类的空参构造
3.当父类中没有无参构造时,需要通过super(带参数);调用其他构造方法
4.构造方法不可以被继承
======================================================
静态 static
      static是一个关键字,
      可以用来修饰变量和方法,被修饰的资源就是静态资源
      静态资源的加载优先于对象,可以直接通过类名调用
      被静态修饰的资源可以直接通过类名调用
      静态的值只有一份
静态资源调用关系
 1.静态资源只能调用静态资源
 2.非静态资源可以调用静态资源与非静态资源

示例代码

继承

package cn.tedu.ectends;

import org.junit.jupiter.api.Test;

public class TestExtendsDemo {
    @Test
    public void test1() {
        Animal animal = new Animal();
        Cat cat = new Cat();
        MiaoMiao miaoMiao = new MiaoMiao();
        animal.eat();
        cat.eat();
        miaoMiao.eat();
        /*3继承具有传递性,爷爷的功能会传给爸爸,爸爸的功能会传给孙子*/
    }

}

//创建爷爷类
class Animal {

    int a = 10;
    private int b = 100;

    public void eat() {
        System.out.println("小动物是什么东西吃什么都行");
    }
}

//2.创建爸爸类 建立继承关系
/*1.我们通过extends关键字建立子类与父类的关系   子类extends父类
 * 2.java只支持单继承,一个子类只能有一个父类,但一个子类只能有多个父类*/
class Cat extends Animal {
    public Cat() {

    }

    /*3子类可以拥有自己的独有的方法,实现功能的拓展,青出于蓝而胜于蓝
     * 4子类继承了父类之后相当于把父类的功能进行了复制*/
    public void studyjava() {
        System.out.println(a);
        /*5父类的私有资源子类不可用,原因是私有不可见*/
        /*6继承是一种is a的关系,比如小猫是小动物 叮当是猫
        * 7要求子类必须是父类的一种继承结构,依赖性非常强,强耦合*/
        // System.out.println(b);//子类不可以使用父类的私有资源
    }

}

//3.创建孙子类
class DingDang extends Cat {

}

class MiaoMiao extends Cat {
}
package cn.tedu.ectends;

import org.junit.jupiter.api.Test;

/*本类用于测试继承中成员方法的使用*/
public class TestExtends2 {
    @Test
    public void test() {
        Father2 f = new Father2();

        Son2 s = new Son2();
        f.eat();
        s.eat();
        s.study();

    }
}

class Father2 {

    public void eat() {
        System.out.println("爸爸爱吃肉");
    }

}

class Son2 extends Father2 {


    /*OCP原则,面向修改关闭 面向扩展开放======只允许功能拓展,不允许修改源代码*/
    //修改父类原有的功能----不允许修改父类的源代码
    /*重写的规则
    * 和父类的方法签名保持一致【方法名&参数列表】
    * 然后去修改子类中的本方法实现,父类的功能并没有被改变
    * 方法修饰符>=父类的修饰符
    返回值类型<=父类的返回值类型
    * 重写时,子类必须拥有可以重写的权限,子类无权修饰父类的私有方法
     */


    @Override/*这是一个注解,可以理解为一个标签。用来标记此方法是不是一个重写的方法*/
    public void eat() {

        System.out.println("老虎不在家,猴子称霸王");
    }

    public void study() {
        System.out.println("包粽子");
    }
}

示例三

package cn.tedu.ectends;

import org.junit.jupiter.api.Test;

/*本类用于测试继承中成员变量的使用*/
public class TestExtends1 {
@Test
    public void test(){
    Son s = new Son();

    s.eat();
}
}

//1.先创建父类
class Father {
    //3.定义父类的属性 -------成员变量
    int sum=1000;
    int count =100;

}
//2.先创建子类
class Son extends Father {




    //4.定义子类中的属性
    int sum=100;
    //5.定义子类中的普通方法
    public void eat(){
        //6.定义子类中的局部变量
        int sum=10;
        //7.测试变量的打印结果
        System.out.println(sum);//10  就近原则
        System.out.println(this.sum);//100 使用this关键字打印本类的成员变量
        /*
        在子类中使用父类的sum资源,需要使用super.进行指定,相当于父类的对象的引用,比如:Father super=new Father

        * */
        System.out.println(super.sum);//有重名的时候通过super.来调用
        System.out.println(count);//没有重名的时候直接进行调用
    }

}

示例四

package cn.tedu.ectends;

import org.junit.jupiter.api.Test;

/*
 * 本类用来测试继承中构造方法的使用*/
public class TestExtends {
    @Test
    public void test(){
        Son1 son = new Son1();

    }

}
//1创建父类
class Father1 {
   /* public Father1() {
        System.out.println("我是父类的无参构造");
    }*/
    public Father1(String a) {
        System.out.println("我是父类的有参构造");
    }

}
//2创建子类
class Son1 extends  Father1{
    //创建子类无参构造
    /*在子类的方法中默认存在super();表示调用父类的无参构造
    * 也就是说,在创建子类对象时,会调用子类的构造方法,继承后,先去调用父类的构造方法,再去调用子类的构造方法
    * 当父类中没有无参构造时,调用的是父类的含参构造
    * 子类不关心具体调用得是父类的那个构造器
    * 只是必须强调父类的的一个构造器而已
    * 父类构造器不允许被继承  原因:因为构造方法的语法要求,构造方法必须与类同名,天然不符合构造要求♩♩
    * */
    public Son1() {
        super("我是你爸爸");
        System.out.println("我是Son1的无参构造");
    }
}

示例五Debug

package cn.tedu.ectends;

import org.junit.jupiter.api.Test;

/*本类用于debug练习*/
/*我们可以在目标代码前面,行号后面添加断点,在按一次取消断点
* 2.Debug断点调试的时候,需要以DeBug."TestDebug.main()"的方式启动*/
/*
3.弹出来有两个窗口
Debugger :这个是Debug模式用于查看执行情况,比如变量当前值得窗口
Console---这个是我们之前常用的控制台,会显示程序执行的效果
 */
/*
4.按f8进行下一步,想结束Debug就按红色方块按钮结束程序
Debug只会在断点处停下来,不断点的位置不会停,要学会合理设置断点位置
 */
public class TestDebug {
    @Test
    public void test(){
        for (int i = 1; i <= 10; i++) {
            System.out.println(i);
        }
    }
}

示例六静态static

package cn.tedu.oopstatic;

import org.junit.jupiter.api.Test;

/*
本类用来测试静态的调用关系
alt +7查看结构
 */
public class TestStatic2 {
@Test
    public void t(){
    Teacher.sleep();
}

}

class Teacher {
    String name;
    static int age;

    public void test() {
        /*普通资源可以调用静态资源*/
        System.out.println(age);
        eat();

        System.out.println("正在授课");
    }

    public void teach() {
        System.out.println("老师机");
    }

    public static void eat() {
        /*2.静态资源不可以调用非静态资源
         * 静态资源可以调用静态资源*/
        //System.out.println(name);//编译时异常:Non-static field 'name' cannot be referenced from a static context
        System.out.println("你真能吃");
    }

    public static void sleep() {
        System.out.println("累了困了喝乐虎");
        System.out.println(age);
        eat();

    }
}

示例七

package cn.tedu.oopstatic;

import org.junit.jupiter.api.Test;

/*本类用于测试静态的入门案例*/
public class TestStatic1 {
@Test
    public void test(){
    System.out.println(Student.name);
    Student.speak();
    Student student = new Student();
    System.out.println(student.name);
    student.study();
    student.name="小乔";
    Student student1 = new Student();
    System.out.println(student1.name);
    System.out.println(student.name);

}

}

class Student {
    /*可以通过static将普通方法资源修饰成静态资源
    * 2.static可以用来修饰成员变量和方法  一般写在修饰符的后面
    * 3.静态资源可以通过类名直接调用,无需创建对象
    * 4.静态资源优先于对象进行加载的,随着类的加载而加载
    *     比对象优先加载到内存,没对象时也可以通过类名直接调用
    * 5.静态资源被全局所有对象共享,值只有一份*/

  static   String name;
    int son;

    public  void study() {
        System.out.println("我不想学java,满脑子都是端午");
    }

    public static void speak() {
        System.out.println("我不想说话");
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᥬ᭄?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值