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; } }