三大修饰符

abstract关键字

abstract抽象就是不具体,不完整的含义

abstract在程序中用来描述抽象的事物和抽象的行为。
例如: 动物、吃、睡、水果

为什么存在抽象?

当描述一类事物的过程中,不断的去提取父类,越往上,属性和行为就变得越模糊不具体,也就越抽象。

抽象类:

定义格式:

abstract class Animal{
  // ...   
}

特点:

不能实例化其本身对象。
可以声明引用,实例化其子类

作用:

可以作为父类存在,定义子类的共性行为和属性
可以作为引用,使用多态

组成成分

  1. 可以定义属性
  2. 可以定义构造器
  3. 可以定义方法
  4. 可以定义抽象方法

总结
普通可以定义什么,抽象类都可以,和抽象类相比,多了可以定义抽象方法的特点,少了可以创建对象的能力。

抽象方法
什么是抽象方法?

abstract 修饰的方法就是抽象方法,抽象方法只有方法声明,没有方法实现
因为无法给出方法的具体实现,是一种不完整的方法,所以唤作"抽象方法"。

定义格式

abstract class Animal{
    public abstract void jiao(); 
    public void other(){
       System.out.println("other ... ");    
    }  
}

特点

  1. 抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类
  2. 抽象类的子类,必须重写 抽象父类中的全部抽象方法,除非自己也是抽象类。
    例:
abstract class Animal{
    public abstract void jiao(); 
    public void other(){
       System.out.println("other ... ");    
    }  
}
class Dog extends Animal{
    @Override
    public  void jiao(){
         System.out.println("汪汪 ... ");    
    }
}

总结

普通可以定义什么,抽象类都可以,和抽象类相比,多了可以定义抽象方法的特点,少了可以创建对象的能力。

static 关键字

  1. 意为 静态的,可以修饰 属性和方法,修饰属性,称为静态属性,修饰方法称为静态方法。
class Tool{
    public static PI=3.14; // 静态属性
    public static void sum(int a,int b){ 
       // 静态方法
        sout(a+b);
    }
}
  1. 静态的内容只有一份,全局唯一,每个对象共享,但不属于每个对象。

实例的每个都有一份,静态的只有一份,任何对象该,都会·影响到其他对象

  1. 静态属性在类加载时就完成 空间的开辟和初始化,不依赖与某个对象调用。
  2. 静态属性和方法通过类名调用 类名.属性 类名.方法
public static void main(String[] args){
    Tool.sum(10,20)
    sout( Tool.PI )
}
  1. 访问 、变量问题

静态方法中 不可 访问 实例属性 也不可使用 this super 关键字
实例方法中 可以访问静态 和 非静态的 属性

  1. 静态代码块

定义语法

static{
    //
}

优先加载并且只加载一次(在JVM类加载的时候就创建了)

父子静态类继承:

父类静态 》 子类静态 》 父类动态 》 父类构造器 》子类动态 》子类构造器

静态代码块的作用 是用来初始化 静态变量的,在类加载时执行一次。以下情况会导致类加载:

  • 创建对象
  • 创建子类对象
  • 调用静态属性和方法
  • 强制加载 Class.forName(“类全名(包目录加类名)”)

扩展类加载:

jvm首次使用某个类,需要通过CLASSPATH查找该类的.clss文件。将.class文件中对类的描述信息加载到内存中,进行保存
从类加载到初始化:
在这里插入图片描述
特点:

  • 静态方法允许直接访问静态方法
  • 静态方法不能直接访问非静态成员
  • 静态方法中不允许使用this或是super关键字
  • 静态方法可以继承,不能重写,没有多态
    总结:
    静态方法为什么不能用非静态方法?
  • 实例方法是对象调用的方法,也就是对象已经存在。而静态的内容在类加载就完成了
  • 静态 方式后调用的方法,此时对象为创建,实力变量不存在,this不存在,super不存在

扩展 动态代码块
语法

    {

           //代码块         

        }

特点:

  • 先于构造器执行
  • 每加载一次执行一次
    作用:

可以为实例属性赋值,或必要的初始行为

final常量

译为最终的 ,可以修饰 变量 方法 类。

  • 修饰变量,定义一个常量

此变量不能被改变(常量)

final int a ;
a=101;
//a=202; 报错
  • 修饰方法,最终方法不可以被重写

意为最终方法,不支持子类以覆盖的形式修改

class ABC{
	public final  void abc() {
		System.out.println("abc");
	}
}
class ABCSon extends ABC{
	/* 重写报错 , 这个方法不允许被重写
	 * @Override public void abc() {
	 * 
	 * }
	 */
}
  • 修饰类,不可被继承

String Math System均为final修饰的类,不能被继承

final class DEF{
	public void abc() {
		System.out.println("abc");
	}
}
/*  继承报错,DEF 不允许被继承
 * class DEFSon extends DEF{
 * 
 * }
 */

注意

abstract 不可以和 private static final 连用

应用场景

实力常量:

  • 实例常量不在提供默认值,必须手动赋予初始值。
  • 赋值时机:显示初始化、动态代码块、构造方法
  • 注意:如果在构造方法中为实力常量赋值,必须保证所有的构造方法为实例常量赋值

静态常量:

  • 静态常量不在提供默认值,必须手动赋予初始值
  • 赋值时机:显示初始化、静态代码块

对象常量:

  • final 修饰基本类型,值不可变
  • final修饰引用类型,地址不可变
  • final修饰类不能被继承
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值