Day12 static、final、abstract
一、static(静态)
1.1概念
标识类级别的成员;//动态为实例级别 //静态为类级别
1.2静态属性
全类共有的属性,不会随着某个对象的改变而改变 比如:圆周率
静态属性优先于对象,不依赖对象,可以使用类名调用静态属性
代码:
public class Person{ static int a = 5; } public class DemoPerson{ public static void main(String[]args){ System.out.println(Person.a);//Person类中的a属性是一个静态属性,可以直接通过类名访问 } }
1.3静态方法
全类共有的方法,不属于某一个对象。
静态方法优先于对象,不依赖对象,可以使用类名调用静态方法。
public class Person{ public static void fun(){ //方法体 } } public class DemoPerson{ public static void main(String[]args){ Person.fun();//Person类中的fun方法是一个静态方法,可以直接通过类名访问 } }
1.4静态代码块
使用static关键字修饰的动态代码块,在类加载时自动执行,并只执行一次。不可手动调用。
1.5对象的创建过程:
1.6带有继承的对象创建过程
1.7类加载
二、抽象 abstract
2.1 abstract关键字
修饰类:抽象类,不能实例化(创建对象)
修饰方法:没有实现(方法体),但是抽象方法必须在抽象类当中。
2.2抽象方法的作用
使用abstract关键字修饰
特点:
1)抽象方法没有方法体,使用分号(;)声明方法结束
public abstract void eat();
2)抽象方法所在的类必须是抽象类
public abstract class Dog{ public abstract void eat(); }
3)抽象方法必须被子类重写。
public abstract class Dog{ public abstract void eat(); } public Somye extends Dog{//必须重写。 public void eat(){ } }
2.3抽象类作用
使用abstract关键字修饰
特点:
1)抽象类的出现由于类中有抽象方法,但是抽象类中也可以没有抽象方法
2)抽象类中有构造方法,但是不能创建对象,构造方法目的是在子类中会被调用
3)抽象类的存在就是为了被继承,抽象类的非抽象子类中必须把抽象类中用的所有抽象方法全部实现
在子类给继承来的抽象方法添加方法体相当于是重写父类的抽象方法
2.4注意
如果子类继承了抽象类,必须实现父类中所有的抽象方法,否则子类还是抽象类。
三、final
3.1final关键字
修饰类:不能被继承
修饰方法:不能被重写
修饰变量:变成常量,值不能被修改。
没有默认值,必须手动赋值。
只能赋值一次
修饰基本数据类型–值不可变
修饰引用数据类型–地址不可变
3.1.1final修饰类(最终类)
final修饰的类无法被继承。
public final class Dog{ } public class Somye extends Dog{//error,Dog是final修饰,无法被继承 }
3.1.2final修饰方法(最终方法)
final修饰的方法不能被重写。
public class Dog{ public final void eat(){} } public class Somye extends Dog{ public final void eat(){}//error,不能重写父类final修饰的方法 }
3.1.3final修饰变量(全局、局部–>常量)
// final 是可以修饰 属性的 修饰的属性必须 在声明的时候就赋值
final static int age =4; public static void main(String[] args) { //final 可以修饰局部变量, 在声明的时候可以不赋值 final String name = "abc"; // name = "abc"; // final 修饰的局部变量只能被赋值一次 // final 修饰 的 全局变量 只能被赋值一次 //age = 9; System.out.println(age); System.out.println(name); }
因为被final修饰的变量只能赋值一次,所以把final修饰的变量叫做常量
3.1.4 static 和final共同修饰变量
与final修饰变量相同,都要在声明的时候进行初始化赋值 static final String name;// = "aaa"; 静态常量:1.手动 2.静态代码块 static{ name = "bbb"; System.out.println(name); }
}
3.1.5 fina修饰对象
//对象常量 引用中的地址 不能改变
final Student stu = new Student();//0x0000a01 不可以进行二次赋予地址
总结:
final修饰类:此类不能被继承。
final修饰方法:方法不能被覆盖
final修饰变量:此变量值不可变(无初始值,只允许赋值一次)
局部变量:显示初始化
实例常量:显示初始化、动态代码块、构造方法。
静态常量:显示初始化、静态代码块
基本数据类型常量:值不可变
不可以进行二次赋予地址
总结:
final修饰类:此类不能被继承。
final修饰方法:方法不能被覆盖
final修饰变量:此变量值不可变(无初始值,只允许赋值一次)
局部变量:显示初始化
实例常量:显示初始化、动态代码块、构造方法。
静态常量:显示初始化、静态代码块
基本数据类型常量:值不可变
引用数据类型常量:地址不可变