Java基础5-接口

昨日内容回顾

  1. jvm参数设置

    • -Xmx //设置最大堆大小
      java -Xmx512m Classname
    • -Xms //设置初始堆大小
      java -Xms24m Classname
    • -Xss //设置栈空间的大小
      java -Xss2m ClassName
  2. class

    成员变量,属性
    成员函数,方法

  3. 构造函数

    和类同名
    没有返回值

  4. javabean规范
    私有属性
    公有getter/setter

  5. 代码块

    • 局部代码块
      在函数内部定义{},
      不能使用static修饰。

    • 构造代码块
      也是类的成员,和成员变量和成员函数同级。
      构造对象时,先调用构造代码块,然后是构造函数。

    • 静态代码块
      构造代码块 + static修饰符。
      静态代码块在类加载的时候执行,而且只执行一次。
      手动控制类加载使用Class.forName("classname"),默认加载类时,执行代码块。
      Class.forName(String,boolean initialize,ClassLoader)可以控制加载时是否初始化。

  6. 继承

    • 将共性的内容进行提取。
    • 很好的进行了重用。
    • 使用的关键字是extends
      class B extends A {....}
    • java中不能多重继承,只能单重继承。
    • this:指向对象自身的引用。
      this(...)表示的是调用当前类的构造函数.只能用在第一行。默认this()
    • super : 超类,作用方面类似于this
      super(...) : 访问超类的构造函数,只能用在第一行。默认是super()
    • 子类重写的方法权限 > 父类的方法权限.(权限可放大,可发扬光大,不能缩小,不能私有化)

作业讲解

  1. 将按位运算操作,尤其是左移和右移(有无符号)整理到自己的博客中,重点说明清晰负数的运算过程。

     //1.有符号左移>>,补符号位
     //127 >> 2
     //0111 1111 >> 2 == 0001 1111 == 31
     System.out.println(127>>2);
     
     //-128 >> 2
     //1000 0000 >> 2 == 1110 0000 == 32
     System.out.println(-128>>2);
     
     //2.无符号左移>>>,补0
     //127 >>> 2
     //0111 1111 >>> 2 == 0001 1111 == 31
     System.out.println(127>>>2);
     
     //-128 >>> 2
     //11...11 1000 0000 >>> 2 == 0011 11...11 1110 0000 == 1073741792
     System.out.println(-128>>>2);
     
     //3.右移<<,补0
     //127 << 2
     //0111 1111 << 2 == 0...0 0001 1111 1100 == 127*4 == 508
     System.out.println(127<<2);
     
     //-128 << 2
     //11...11 1000 0000 << 2 == 11...10 0000 0000 == -128* 4 = -512
     System.out.println(-128<<2);
    
  2. byte数到十六进制字符串表现形式程序设计原理和实现方式整理到博客中。
    答:byte数在计算机中以8位二进制数进行存储,十六进制以0x开头,每位数的范围为09,AF;注意到4位二进制数可以表示一位十六进制数,一个byte数可以由两位十六进制数表示;因此,先将byte数的低四位和高四位分别取出,再用十六进制数表示。

     byte b = 127;
     char[] hexArr= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
     //取出低四位
     int low = b&0xf
    
     //取出高四位
     int high = (b>>4)&0xf
     System.out.println(b+"=0x"+c[high]+c[low]);
    
  3. 定义函数,计算一位整型数组所有元素的和。

     int sum(int[] arr){
         int sum = 0;
         for(int i=0;i<arr.length;i++){
             sum = sum + arr[i];
         }
         return sum;
     }
    

面向对象

OOP:Oriented object program

  • 类,现实事物的软件抽象
  • 对象,切实存在的个体
  • 类的成员
    成员变量,成员函数,构造函数(和类同名,没有返回值,可以重载),构造代码块,静态代码块

方法的覆盖操作

  1. 静态覆盖静态,非静态覆盖非静态,静态性约束保持一致

  2. 覆盖方法时,权限可以放大,但不可以缩小

final

终态的

  1. 修饰类,表示类不能被继承。

  2. 修饰方法,表示方法不能被重写。
    私有方法可以加final,没有意义,编译通过。(不可能发生)

  3. 修饰变量,只能被赋值一次。如果不赋值,编译通不过。

内部类

  1. 定义在类内部的类称为内部类

  2. 内部类可以在类成员位置上
    编译时产生的类:外部类$内部类,例如Benz$Engine.class

  3. 内部类还可以在方法内定义
    Benz$1Engine.class

  4. 内部类访问局部变量时,不能对局部变量进行重新赋值。java8中不需要用final修饰

abstract

  1. 没有方法体的方法。必须使用abstract修饰。

  2. 抽象方法只能存在于抽象类中。

  3. 抽象类也必须要使用abstract修饰。

  4. 抽象类不可以实例化,但一定有构造函数。

  5. abstract + static 是非法的修饰符组合。
    abstract + final 是非法的修饰符组合。
    abstract + private是非法的修饰符组合。

  6. 面向接口编程,降低耦合度。
    开发原则:高内聚,低耦合。

接口

interface:降低耦合度,所有方法都是抽象的

案例:白富美,高富帅

练习

  1. 定义Car类为抽象类

     class Car{
         speed
         run()		//具体的方法,汽车跑动前先鸣笛。
         speak()		//鸣笛,抽象
     }
    
  2. Car的子类

     class BMW extends Car{
     	...
     }
    
     class Benz extends Car{
     	...
     }
    

作业

  1. 文字阐述静态代码块的作用。

  2. 构造代码块与构造函数的调用顺序如何?和方法的声明位置是否有关?为什么?构造代码块的作用是什么?

  3. 类加载时,是否一定会执行静态代码块?如何手动控制类加载?

  4. 定义类Person,Man,Woman形成继承关系。

  5. 什么是抽象方法?什么是抽象类?抽象类是否有构造函数,是否可以重载?

  6. 抽象修饰符有哪些非法组合?并给出合理的解释?

  7. super和this作用以及用法以及注意事项?

  8. 定义接口

    • IWhite
    • IRich
    • IBeanti
    • 定义类,实现以上三个接口.(WomenStar)
    • 定义土豪类(EarchRicher.marring(...))