代码块,继承及final关键字

来源:互联网 发布:windows命令行创建文件 编辑:程序博客网 时间:2024/06/07 06:50
一、代码块
 代码块表示一个范围。在java语言中{}表示包含一个范围
 
 写在方法中(局部代码块)
  public void method1() {
   {
    int x = 100;// 局部代码块中的一个变量,使用后会立即释放
   }
   // 局部代码块外不能访问局部代码块内的变量
  }
  
 写在类中:1、构造代码块
   class ClassA {
    {
     System.out.println("构造代码块");// 优先于构造方法执行,且每new一个对象都会执行
    }
    public ClassA() {
    }
   }
 
   2、static代码块
   class ClassB {
    static {
     System.out.println("静态代码块");// 在加载字节码文件的时候加载,方法区中的静态区,加载一次
    }
   }
 
继承
 继承语法概述:
  之前写程序为了复用我们写在方法中,反复调用即可。但是随着方法变多,和方法的功能混杂,我们一组类似的方法抽取封装成一个类。
  类可以创建对象,且可以创建n个对象,类可以看成一个模板,是另一种复用。当我们学习面向对象之后让人烦恼的事情:类爆炸,程序员工作量瞬间增加
  在模板这个设计的角度来说可以运用中国古老的一种变成风格(活字印刷术),提醒了我们class,还能够进行更加灵活的复用:继承
 
 继承的格式:只能用在类上(子类,父类)
  父类:表现形式上,就是一个普通的类:class 类名
  子类:表现上是不同的类,类名的后面是要继承的父类:class 子类名 extends 父类名
  
 继承的好处:子类中,很多的方法,不用重复写,可以都写在父类中,可维护性好,复用
    弊端:耦合性增强
  
 继承中成员变量的特点:父类和子类的成员变量不相同(可以直接使用父子类中的成员变量)
      父类和子类的成员变量名相同了(this表示子类和super表示父类调用)
      举例:this.name(调用子类的属性姓名)super.age(表示调用父类的属性年龄)
  
   class A {
    int num = 30;
   }
   
   class B extends A {
    int num = 20;
    
    public void method() {
     int num = 10;
     System.out.println(num);
     System.out.println(this.num);   -------|在类的属性中去查找
     System.out.println(super.num);  -------|
    }
   }
 
 继承中构造方法的特点:
  子类在初始化的时候,先做父类的构造方法初始化,再做子类的构造方法(默认的子类方法中都是父类的无参数的构造方法)
  
  如果父类没有给我提供默认的无参数的构造方法:
   
   1、自己手动加载无参数的构造方法 
   2、用手动的方式调用父类有参数的构造方法
    class Fu {
     public Fu(String name) {
      // ...
     }
    }
    
    class Zi extends Fu {
     public Zi(String name) {
      super(name);
     }
    }
 
   3、在子类中使用this调用有参数的构造方法
    class Fu {
     public Fu(String name) {
      // ...
     }
    }
    
    class Zi extends Fu {
     public Zi() {
      // 注意由于Fu类中没有默认的构造方法了,只能通过this自己调用自己
      this("刘德华");// 不常用
     }
     
     public Zi(String name) {
      super(name);
     }
    }
 
 继承中成员方法的特点:
  如果方法名不相同,可以直接调用
  
  如果子类方法和父类的方法一模一样,那么子类覆盖父类的方法(叫重写),是给多态准备(明天将多态)就近原则
  
 重写:
  父类中的某个方法是最通用的,在业务逻辑中满足大部分需求,所以才放在父类中公用。
  子类的某个方法需要有自己的独特的特性,那么就要重写父类的方法了,但是重写的过程中,还是依然可以做父类的方法的调用super.方法名()。
  只需要做略微的变化就可以了,子类可以继承使用父类,还可以扩展父类的功能
  
 重载、重写的区别:
  首先要对这两个概念非常清楚
  重载是针对于一个类中方法的
   方法名字定义成一个是方便程序员使用,但是根据参数的方式自行匹配
  
  重写是针对于继承机制中的多个类的方法
   重写的目的,对父类的代码进行扩展,或者变化特别大完全覆盖 
 
 
final关键字
 final:终结的终止的最终的
 
 final局部变量:
  还能否二次赋值?(不能,用final修饰的变量类型其实发生了质的变化:自定义常量)
  字面值常量:基于基本数据类型
  
 final方法:
  不能被子类重写,可以被子类使用
  
 final类:
  所有的方法都不想被重写(安全),当前类用final标识
  
 
 final如果将变量变成常量:
  final后面的变量名:单个单词全大写final double PI = 3.1415926;、多个单词全大写且用下划线连接final int MIN_INIT_NUMBER = 1;
  final修饰后的常量是依附于对象的,而我们希望加上public static 依附于类。通过类名.常量名直接访问
   
 final修饰的是基本数据类型:不能赋值
   修饰的是引用数据类型:能赋值,不能更改其引用地址
  
  
  
  
  
  
  
0 0
原创粉丝点击