继承及其相关的知识(2022.4.3)

目录

static关键字

静态代码块:

实例代码块(了解)

继承:

方法重写(方法覆盖)

final关键字


  1. static关键字

    • 静态变量在类加载的时候初始化,不创建对象,内存就开辟了;存储在方法区内存当中;

    • 什么时候成员变量为实例变量?什么时候声明为静态变量?

      ——所有对象都有这个属性,但这个属性的值会随着对象的变化而变化【不同对象的这个属性具体的值不同】。——所有对象都有这个属性,并且所有对象的这个属性的值是一样的,定义为静态变量以节省内存的开销。

  2. 静态代码块:

    • 语法格式:static{ java语句; }

    • 静态代码块在类加载时执行,并且只执行一次

    • 静态代码块在一个类中可以缩写多个,并且遵循自上而下的顺序依次执行

    • 静态代码块的作用?怎么用?用哪?什么时候用?

      ——这当然和具体的需求有关,例如项目要求类加载的时刻/时机执行代码完成日志的记录,那么这段记录日志的代码就可以写在静态代码块中,完成日志

      public class StaticTest {
          static {
              System.out.println("类加载1");
          }
          static {
              System.out.println("类加载2");
          }
          static {
              System.out.println("类加载3");
          }
          public static void main(String[] args) {
              System.out.println("main begin");
          }
      }

  3. 实例代码块(了解)

    • 实例代码块可以缩写多个,也是自上而下依次执行

    • 实例代码块在构造方法执行之前执行,构造方法依次执行,实例代码块对应执行一次

    • 实例代码块也是java语音为程序员准备一个特殊的时机,这个特殊时机被称为:对象初始化时机

      public class StaticTest {
          public StaticTest() {
              System.out.println("StaticTest类的缺省构造器执行");
          }
          {
              System.out.println(1);
          }
          {
              System.out.println(2);
          }
          {
              System.out.println(3);
          }
          public static void main(String[] args) {
              System.out.println("main begin");
              new StaticTest();
              new StaticTest();
          }
      }

      如图:

  4. 继承:

    • 继承的“基本”作用是:代码复用。但继承“最重要”的作用是:有了继承才有了以后”方法覆盖“和”多态机制“

    • 语法格式:

      [修饰符列表] class 类名 extends 父类名{ 类名=属性+方法 }

    • java语言当中的继承只支持单继承,一个类不能同时继承很多类,只能继承一个类,在c++中支持多个继承

    • 术语:B类继承A类,其中,A类称为:父类、基类、超类、superclass。B类称为:子类、派生类、subclass

    • 在java语音当中子类是继承父类都继承哪些呢?

      ——私有的不支持继承、构造方法不支持、其他数据可以继承

    • 一个类可以间接继承其他类,如:C直接继承B类,但C类间接继承T、A类

      C extends B {   }
      B extends A {   }
      A extends T {   }

    • java语音中假设没有一个类显示的继承任何类,该类默认继承JavaSE库当中提供的java.lang.Object类

      public class ExtendsTest {
          public static void main(String[] args) {
              ExtendsTest et = new ExtendsTest();
              String s = et.toString();
              //编译通过,这说明可以调用toString方法,ExtendsTest类中有toString方法,从Object类中继承过来的
              System.out.println(s);//结果:ExtendsTest@1db9742
          }
      }
  5. 方法重写(方法覆盖)

    • 当父类中的方法已经无法满足当前子类的业务需求,子类有必要将父类中继承过来的方法进行重写,这个重新编写的过程称为方法重写/覆盖

    • 需要满足的条件:方法重写发生在具有继承关系的父子类之间。返回值类型相同,方法名相同、形参列表相同。子类的访问权限不能更低,只能更高。【如果Animal中的move()的修饰符是public,那么子类的move()的修饰符不能为private、protected,如果Animal中的move()的修饰符是protected,那么子类的move()的修饰符可以为public】

    • 抛出异常不能更多,可以更少。建议方法重写时尽量复制粘贴,不要编写,容易出错,防止没有产生覆盖

    • 私有方法不能继承,so不能覆盖;构造方法不能继承,so不能覆盖;静态方法不存在覆盖;覆盖只针对方法,不谈属性

      //有问题,十万个为什么。。
      /* import hh.*;
      OverrideTest.java:4: 错误: 无法访问Animal
                      Animal a = new Animal();
                      ^
        错误的源文件: .\Animal.java
          文件不包含类Animal
          请删除该文件或确保该文件位于正确的源路径子目录中。 */
      import hh.Animal;
      import hh.Bird;
      import hh.Cat;
      public class OverrideTest {
          public static void main(String[] args) {
              Animal a = new Animal();//动物类
              a.move();
              
              Cat c = new Cat();//猫类
              c.move();
              
              Bird b = new Bird();//鸟类
              b.move();
          }
      }
      ​
      //方法覆盖就是子类可以修改父类的方法的内容吧
      package hh;
      public class Animal {
          public void move() {
              System.out.println("动物在移动");
          }
      }
      ​
      package hh;
      /*public class Cat extends Animal { }*/
      public class Cat extends Animal {
          public void move() {
              System.out.println("猫在走猫步");
          }
      }
      ​
      package hh;
      /*public class Bird extends Animal {    }*/
      public class Bird extends Animal {
          public void move() {
              //super.move();此结果为“动物在移动”
              //super();报错:对super的调用必须是构造器中的第一个语句
              System.out.println("鸟在飞");
          }
      }
      //结果:
      /*未进行方法覆盖
      动物在移动
      动物在移动
      动物在移动
      */
      /*进行了方法覆盖
      动物在移动
      猫在走猫步
      鸟在飞
      */

  6. final关键字

    • final修饰的类无法被继承,修饰的方法无法被覆盖,修饰的变量一旦被赋值后就不可重新赋值

      public class FinalTest {
          public static void main(String[] args) {
              
          }
      }
      class MyString extends String {
          
      }
      //结果报错:无法从最终String进行继承,String是被final修饰的类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值