11、java基础——三个修饰符abstract、static、final

发布于:2022-12-31 ⋅ 阅读:(202) ⋅ 点赞:(0)

1. abstract

  • 父类的一个方法一定会被子类重写

  • 这个方法的方法体一定不会执行

  • 那么方法体就没有存在的意义,我们就可以把方法体删了

  • 但是一个正常的方法是必须要有方法体的

  • java规定abstract修饰的方法,可以没有方法体,叫做抽象方法

  • java又规定了,抽象方法必须定义抽象类中,有abstract修饰的类叫做抽象类

抽象类

由abstract修饰的类叫做抽象类

  • 抽象类的子类必须重写抽象方法

  • 抽象类不能实例化,一定要指定子类的对象

  • 抽象类可以定义属性,实例方法,构造方法

    • 构造方法,也会在子类对象创建时执行

抽象方法

由abstract修饰的方法叫做抽象方法

  • 抽象方法没有方法体

  • 抽象方法必须定义在抽象类中

2. static

2.1 修饰属性

由static修饰的属性,叫做静态属性,所有的对象都共用一份

一般通过 类名.属性名 操作该属性

package com.qfedu;
​
public class Demo01 {
​
    public static void main(String[] args) {
        
        Person.county = "中国";
        
        Person p1 = new Person();
        p1.name = "钱学森";
        p1.age = 18;
    //  p1.county = "中国";
        
        p1.print();
        
        Person p2 = new Person();
        p2.name = "钱三强";
        p2.age = 12;
    //  p2.county = "中国";
        
        p2.print();
        
        Person p3 = new Person();
        p3.name = "钱钟书";
        p3.age = 17;
    //  p3.county = "中国";
        
        p3.print();
        
    }
    
}
​
class Person {
​
    String name;
    int age;
    
    static String county;
    
    public void print() {
        System.out.println(name+","+age+","+county);
    }
    
}

package com.qfedu;
​
public class Demo02 {
​
    public static void main(String[] args) {
        A a = new A();
        a.name = "jakema";
        A a2 = new A();
        a2.name = "pony";
        A a3 = new A();
        a3.name = "tomlei";
    }
}
​
class A {
    
    String name;
    
    static int count;
    
    public A() {
        count++;
        System.out.println("我被创建了"+count+"次");
    }
    
}

2.2 修饰方法

由static修饰的方法,叫做静态方法,可以直接使用类名.方法名() 调用方法

避免了创建对象,减少资源的消耗。

  • 在静态方法中,只能操作静态属性

  • 不能使用this,super

package com.qfedu;
​
import java.util.Arrays;
​
public class Demo03 {
​
    public static void main(String[] args) {
        
        int sum = MathUtil.sum(1, 2);
        
        System.out.println(sum);
        
        
    }
    
}
​
class MathUtil {
    
    static int a;
    
    public static int sum(int n1, int n2) {
        return n1+n2;
    }
    
    /*
     * 静态方法只能操作静态属性
     * 不能使用this,super关键字
     */
    public static void changeA() {
        a +=2;
    }
    
    /*
     * 编写静态方法,参数为两个   一个整数数组 arr     一个整数n,表示的是第几大  
     * 返回一个整数
     */
    public static int getValue(int[] arr, int n) {
        Arrays.sort(arr);
        return arr[arr.length - n];
    }
    
}

2.3 修饰代码块

语法:

{}
  • 在创建对象时,在构造方法执行之前执行

  • 代码块可以定义多个,按照顺序执行

  • 在每一次创建对象时,都会执行代码块

由static修饰的代码块,叫做静态代码块

  • 就是在使用一个类时,为该类的静态属性赋值

static {
​
}
  • 执行的优先级比代码块高

  • 可以定义多个静态代码块,他们按照顺序执行

  • 静态代码块只在第一次创建对象时执行

  • 静态代码块只能操作静态属性

3. final

final: 最终的意思,可以修饰类,属性,方法

3.1 修饰类

final修饰的类,不能被继承,不会产生多态

package com.qfedu;
​
public class Demo01 {
​
}
​
//final修饰的类不能被继承
final class A {
    
}
​
/*
 * class B extends A {
 * 
 * }
 */

3.2 修饰方法

final修饰的方法,不能被重写,不会产生多态

package com.qfedu;
​
public class Demo02 {
​
}
​
/*
 * final修饰的方法不能被重写
 * 
 * final不能修饰抽象方法
 */
class C {
     
    public final void m1() {
        
    }
    
    public void m2() {
        
    }
}
​
class D extends C {
    
    public void m2() {
        
    }
}

3.3 修饰变量

final修饰的变量,不能被修改,我们称之为常量。

package com.qfedu;
​
public class Demo03 {
​
    public static void main(String[] args) {
        /*
         * final修饰局部变量
         * 可以先声明,再赋值     一旦赋值就不能修改
         */
        final int a;
        a = 5;
    }
    
}
​
class E {
    /*
     * final修饰属性,必须为属性赋值(不要再想他有默认值),一旦赋值就不能再修改
     * 1. 可以直接赋值
     * 2. 也可以在代码块中赋值
     * 3. 在构造方法中赋值
     */
    final int a;
    
    {
    //  a = 5;
    }
    
    
    public E() {
        a = 6;
    }
    
}

网站公告

今日签到

点亮在社区的每一天
去签到