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