day02【static、final、权限关键字,代码块,接口,枚举】.pptx

一、static关键字

static静态的引入

static属于一个修饰符号,用来修饰成员变量、成员函数的

  1. static修饰函数的格式:
  2. 修饰符 返回值类型 函数名( 参数 )
  3. {
  4. 函数体;
  5. }
  1. class Student
  2. {
  3. public static void sleep()
  4. {
  5. System.out.println("睡觉。。。。。。");
  6. }
  7. }
  8. public class StuDemo2 {
  9. public static void main(String[] args) {
  10. // 调用静态方法
  11. Student.sleep();
  12. }
  13. }

静态代码块

静态代码块:定义在成员位置,使用static修饰的代码块{ }。

  • 位置:类中方法外。
  • 执行:随着类的加载而执行且执行一次。
  1. public class ClassName{
  2. //静态代码块
  3. static {
  4. // 执行语句
  5. }
  6. }

作用:给类变量进行初始化赋值 小结:1.当 static 修饰成员变量或者成员方法时,该变量称为静态变量,该方法称为静态方法。该类的每个对象都共享同一个类的静态变量和静态方法。任何对象都可以更改该静态变量的值或者访问静态方法。但是不推荐这种方式去访问。因为静态变量或者静态方法直接通过类名访问即可,完全没有必要用对象去访问。
2.无static修饰的成员变量或者成员方法,称为实例变量,实例方法,实例变量和实例方法必须创建类的对象,然后通过对象来访问。
3.static修饰的成员属于类,会存储在静态区,是随着类的加载而加载的,且只加载一次,所以只有一份,节省内存。存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。它优先于对象存在,所以,可以被所有对象共享。
4.无static修饰的成员,是属于对象,对象有多少个,他们就会出现多少份。所以必须由对象调用。
5.静态方法中不能使用和对象有关的所有内容:this super….

二、包和权限修饰符

权限修饰符

在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限,我们之前已经学习过了public 和 private,接下来我们研究一下protected和缺省(default默认)修饰符的作用。

  • public:公共的,所有地方都可以访问。
  • protected:当前类 ,当前包,当前类的子类可以访问。
  • 缺省(没有修饰符):当前类 ,当前包可以访问。
  • private:私有的,当前类可以访问。 public > protected > 缺省 > private

不同权限的访问能力

:::info | | public | protected | 缺省(空的) | private |
| ———— | ——— | ————- | ——— | ———- |
| 同一类中 | √ | √ | √ | √ |
| 同一包中的类 | √ | √ | √ | |
| 不同包的子类 | √ | √ | | |
| 不同包中的无关类 | √ | | | | ::: 注意事项: :::danger 注意:
1)如果父类中的函数使用protected关键字修饰,那么这个函数可以被不同包下的子类访问,而不同包中的其他类不能访问。
2)protected只能修饰成员函数或成员变量,不能修饰类。
3) 四种访问权限,能够跨包访问的只有 public protected(必须是子类) :::

三、final关键字

  • final: 不可改变。可以用于修饰类、方法和变量。
    • 类:被修饰的类,不能被继承。即final修饰的类不能有子类。
    • 方法:被修饰的方法,不能被子类重写。
    • 变量:被修饰的变量,不能更改变量的值。

使用方式:

  1. java
  2. final class 类名 {
  3. }
  4. 修饰方法
  5. 修饰符 final 返回值类型 方法名(参数列表){
  6. //方法体
  7. }
  8. 修饰变量**局部变量——基本类型**
  9. public class FinalDemo1 {
  10. public static void main(String[] args) {
  11. // 声明变量,使用final修饰
  12. final int a;
  13. // 第一次赋值
  14. a = 10;
  15. // 第二次赋值
  16. a = 20; // 报错,不可重新赋值
  17. }
  18. }

四、代码块

1 构造代码块

  • 构造代码块:
    • 位置:定义在成员位置的代码块{}
    • 执行:每次创建对象都会执行构造代码块
    • 作用:一般是一个类的多个构造方法重复的代码放到构造代码块中
public class Teacher {
    String name;
    int age;

    //定义计数器
    static int count = 0;
    //构造代码块
    //构造代码块会在构造方法之前执行,并且每次执行构造方法都会先执行构造代码块
    {
        System.out.println("构造代码块");
        //统计
        count++;
    }

    //无参构造
    public Teacher(){
        System.out.println("构造方法");
    }
    //有参构造
    public Teacher(String name, int age){
        this.name = name;
        this.age = age;
    }
}

静态代码块


        static{

        }

局部代码块

定义在方法中:
{

}

执行顺序演示

public class AAA {
    //静态代码块
    //静态代码块只会执行一次 并在最开始第一个执行
    static{
        System.out.println(2);
    }
    //构造代码块
    //在每次执行构造方法之前先执行构造代码块
    {
        System.out.println(3);
    }
    //构造方法
    public AAA() {
        System.out.println(1);
    }

}

public class Demo04{
    public static void main(String[] args) {
        //创建对象
        AAA a1 = new AAA();
        AAA a2 = new AAA();
    }
}

执行结果:    2 3 1 3 1

五、接口

接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8)。 接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。

引用数据类型:数组,类,接口。

public interface 接口名称 {
    // 抽象方法
    // 默认方法
    // 静态方法
}
含有抽象方法
public interface InterFaceName {
    public abstract void method();
}
含有默认方法和静态方法
public interface InterFaceName {
    public default void method() {
        // 执行语句
    }
    public static void method2() {
        // 执行语句    
    }
}

非抽象子类实现接口:

  1. 必须重写接口中所有抽象方法。
  2. 继承了接口的默认方法,即可以直接调用,也可以重写。
    class 类名 implements 接口名 {
     // 重写接口中抽象方法【必须】
       // 重写接口中默认方法【可选】
    }
    

    抽象方法的使用

    定义接口:

    ```java 定义接口:

public interface LiveAble { // 定义抽象方法 public abstract void eat(); public abstract void sleep(); }

定义实现类: public class Animal implements LiveAble { @Override public void eat() { System.out.println(“吃东西”); }

@Override
public void sleep() {
    System.out.println("晚上睡");
}

}

小贴士:子接口重写默认方法时,default关键字可以保留。子类重写默认方法时,default关键字不可以保留
<a name="iLDAs"></a>
### 接口小结
接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用**public static final**修饰。- JDK8前接口中的方法全是抽象方法,默认会自动加上**public abstract**修饰<br />- JDK 8开始,接口不再纯洁,支持**静态方法,默认方法**,私有方法。<br />- 接口中,没有构造器,**不能创建对象**。<br />- 类与接口是多实现的 implements<br />- 接口与接口是多继承的 extends<br />- 接口体现的规范。
<a name="gTUrv"></a>
## 六、枚举
```java
enum Sex {
    BOY, GIRL; // 男,女
}

1)从反编译的代码可以看出编译器确实帮助我们生成了一个Sex类(注意该类是final类型的,将无法被继承)而且该类继承自java.lang.Enum类,Enum类是一个抽象类 2)除此之外,编译器还帮助我们生成了2个Sex类型的实例对象分别对应枚举中定义的2个性别,这也充分说明了我们前面使用关键字enum定义的Sex类型中的每种性别枚举常量也是实实在在的Sex实例对象。

枚举补充

枚举的本质是一个类,所以枚举中还可以有成员变量,成员方法等。 1)枚举的属性上面不能书写任何代码,如果属性下面有代码,需要使用分号结束属性的编写 2)只要我们使用枚举类型,那么属性属于静态的,并且给属性赋值,会创建对象,执行无参构造方法 3)如果想执行有参构造,可以给属性后面添加小括号,并赋值实际参数 4)枚举中的构造函数必须是私有的

枚举表示性别:
public enum Sex {
    MAIL, FEMAIL;
}
枚举表示方向:
public enum Orientation {
    UP, RIGHT, DOWN, LEFT;
}


枚举表示季度
public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
}
  • 枚举类在第一行罗列若干个枚举对象,是常量。(多例)- 枚举是不能在外部创建对象的,枚举的构造方法默认是私有的。
    - 枚举通常用于做信息的标志和分类。