Core Java第八章知识点总结——三个修饰符
知识点预览
static修饰符
final修饰符
abstract修饰符
static修饰符
1.static修饰符可以修饰什么
属性
方法
静态代码块
2. static修饰属性
a) static可以修饰属性(静态属性),不可以修饰局部变量
TestStatic1
b) static修饰属性的特点
i. static修饰的属性全类公有 TestStatic
package chp8.ex01;
/**
*
* 说明:本程序演示了static修饰属性的用法 全类共有
*/
class MyValue{
int a;
static int b;//静态属性
}
public class TestStatic{
public static void main(String args[]){
MyValue mv1 = new MyValue();
MyValue mv2 = new MyValue();
mv1.a = 100;
mv1.b = 200;
mv2.a = 300;
mv2.b = 400;
System.out.println(mv1.a);
System.out.println(mv1.b);//400
System.out.println(mv2.a);
System.out.println(mv2.b);//400 MyValue.b 亦可
}
}
ii. static修饰的属性可以通过类名访问 MyValue.b
iii. static修饰的属性也叫做类变量
iv. static修饰的属性什么时候被初始化
类加载的时候初始化static修饰的变量
使用类之前,一个类只加载一次
.class------->内存------->JVM内存------->对象
私有访问修饰符 private
2个方法 获得 设置
3. static修饰方法
a)static修饰的方法称为静态方法 public static 和static public均可
b) 静态方法可以通过类名调用 TestStaticMethod.test();
c) 非静态方无论属性和方法是否是静态的都可以访问
d)静态方法只能访问静态属性和静态方法 TestStaticMethod3
package chp8.ex04;
/**
*
* 说明:本程序演示了static修饰方法的用法
*/
public class TestStaticMethod3 {
static int a= 10;
int b = 20;
public void test1(){}
public static void test2(){}
//静态方法只能访问静态属性和静态方法
public static void test3(){
System.out.println(a);
//System.out.println(b); //错误
//test1(); //错误
test2();
}
}
e) 静态方法中不能使用this关键字
f)非静态方法只能覆盖非静态方法
g)静态方法只能覆盖静态方法,但是没有多态 TestStaticOverride
package chp8.ex05;
/**
*
* 说明:本程序演示了静态方法的覆盖用法
*/
public class TestStaticOverride {
public static void main(String args[]){
Super s = new Sub();
//输出this is super
s.m();//等效于 Super.m()
}
}
class Super{
public static void m(){
System.out.println("this is super");
}
}
class Sub extends Super{
//静态方法只能覆盖静态方法,但是没有多态
public static void m(){
System.out.println("this is sub");
}
}
4. 静态代码块
a) 静态代码块的概念
在类加载时执行静态代码块的内容
static{} 一般是对资源操作的内容
final修饰符
1. final修饰符可以修饰什么
a) 变量
b) 方法
c) 类
2. final修饰变量
a) final修饰变量(属性、局部变量)
一旦赋值其值不可改变
b)final修饰局部变量----->常量(以大写形式声明)
TestFinalLocalVar1
package chp8.ex07;
/**
*
* 说明:本程序演示了final修饰属性的用法
*/
public class TestFinalLocalVar1 {
public static void main(String args[]){
final int A = 10;//一旦赋值 其值不可改变
//A++ //错误
}
}
TestFinalLocalVar2
package chp8.ex08;
/**
*
* 说明:本程序演示了final修饰类变量的用法
*/
public class TestFinalLocalVar2 {
public static void main(String args[]){
final MyClass M1 = new MyClass();//final MyClass 引用存储的地址不可变 但是类的属性值可以改变
M1.value = 20;
M1.value = 30;
//The final local variable M1 cannot be assigned. It must be blank and not using a compound assignment
//M1 = new MyClass();//错误
}
}
class MyClass{
int value;
}
final MyClass 引用存储的地址不可变
3. final修饰属性
a) final修饰属性时,必须对属性显示赋值或者提供构造方法对属性赋值
构造得到重载必须对属性赋值
不能同时采用显示赋值或者提供构造方法对属性赋值
b) final static一起修饰属性(如果是final修饰变量,推荐一起使用)
单独的final------->浪费资源,没有意义
static final intI = 10;//减少内存占用
4. final修饰方法和类(不能被改变)
a) final修饰符修饰的方法不能被子类覆盖
b) final修饰符修饰的类不能被继承
abstract修饰符
1. abstract修饰符可以修饰什么
类
方法
2. abstract修饰符修饰类
a) abstract修饰符修饰的类叫做抽象类
abstract class
b) 抽象类的特点
i. 抽象类可以用于声明,但不允许创建对象
MyClass m1;//正确
m1 = new MyClass;//错误
ii.抽象类可以被子类继承,从而创建子类对象
3.抽象方法
a) abstract修饰的方法叫做抽象方法
只有声明没有实现
b) 抽象方法的特点
i. 拥有抽象方法的类必须是抽象类
ii. 抽象类不一定有抽象方法
iii. 抽象方法由子类实现
4. 抽象的作用
抽象类是更高层次的抽象
子类共性的方法抽取成抽象方法,形成一种概念性质的类,抽象方法由其子类实现
package chp8.ex15;
/**
*
* 说明:本程序演示了抽象类的具体抽象
* 抽象类是更高层次的抽象
* 子类共性的方法抽取成抽象方法,形成一种概念性质的类,抽象方法由其子类实现
*/
public class TestAbstract {
public static void main(String args[]){
Shape s = new Circle(3);
double grith = s.girth();
System.out.println("grith is "+grith);
}
}
//抽象类
abstract class Shape{
public abstract double girth();
public abstract double area();
}
//子类 实现其抽象方法
class Circle extends Shape{
private double r;
private static final double PI = 3.1415926;
public Circle(double r){
this.r = r;
}
public double girth(){
return 2*PI*r;
}
public double area(){
return PI*r*r;
}
}
//子类 实现其抽象方法
class Rect extends Shape{
private double a;
private double b;
public Rect(double a, double b){
this.a = a;
this.b = b;
}
public double girth(){
return 2*(a+b);
}
public double area(){
return a*b;
}
}