3分钟弄明白JAVA三大修饰符

JAVA的三个修饰:static,final,abstract,在JAVA语言里无处不在,但是它们都能修饰什么组件,修饰组件的含义又有什么限制,总是混淆。所以来总结对比一下。

1 static静态修饰符

static修饰符能够修饰属性,方法,初始代码块。不能修饰局部变量和类。

首先要明白属性分为静态和非静态,静态的称为静态属性,又叫类变量,非静态的称为实例变量。

静态变量和静态方法统称为静态成员。

修饰属性

静态属性又称类变量,它不属于某个对象,是属于类的,是所有对象共同享有。

eg:类名.静态属性 =对象1.静态属性=对象2.静态属性=同一块内存里所对应的地址

修饰方法

1:静态方法可以直接类名.方法名调用。

2:静态方法里只能:访问静态成员,不能访问非静态成员。

3:静态方法里不能用this关键字。

4:静态法法里没有多态,只能被静态方法覆盖。

修饰初始代码块

static修饰初始代码块称为静态代码块。静态代码块是在类加载的时候运行。这里回顾一下类加载。

类加载:

//TestPerson .java

class Person{

static{

System.out.println("static here");

}

public Person(){

System.out.println("构造方法");

}

}

public class TestPerson(){

public static void main(){

Person p1 = new Person();

Person p2 = new Person();

}

}

运行 TestPerson .java文件会编译生成TestPerson .class 和 Person.class两个class文件。

执行java  TestPerson 首先会启动JAVA虚拟机(JVM),然后再硬盘上找到TestPeson.calss文件,并开始解释执行,

此时JVM里只有TestPerson.class这一个类的信息,顺序执行到main方法,遇到,Person p1 = new Person(),

创建Person对象,JVM会根据CLASSPATH环境变量找到Person.class文件,把Person类的信息读入到JVM里,

保存起来。这个过程就是类加载。

类加载:加载类信息;

执行静态代码块;

为静态属性分配空间并初始化值。

以上例子的执行顺序结果如下:

static here

构造方法

构造方法

2final修饰符

final修饰符能够修饰变量,方法,和类。

final修饰变量

final修饰的变量称为常量,一旦赋值不能更改。对于基本类型来说是其值不能改变,对于对象类型来说是其址不能改变。

final变量的赋值说明:一般的实例变量在创建时JVM会给其分配空创建默认值。但是final变量只能有一次赋值机会,所以,对于final变量,JVM不会为其赋值,唯一的赋值机会留给程序员。

final类型的实例变量赋值在1:初始化属性,

2:调用构造方法,两种方式必须抓住其中一次机会,但不能试图抓住两种机会。

final修饰方法

final修饰方法,表示该方法不能被子类覆盖。

eg:class A{ public final void a1(){.....}}

class B extends A{public void  a1(.....)}

//编译错误无法覆盖

final修饰类

final修饰类表示该类不能被继承

一个类中有final方法,该类可以被继承,但无法覆盖final方法,但一个类是final类,则该类不能被继承,更无从谈起覆盖。

eg:final赋值

class Person {

final int num = 10 ; //初始化属性

public Perosn(int num){

this.num = num;

}

}

class Person {

final int num ;

public Perosn(int num){//构造方法赋值

this.num = num;

}

}

class Person {

final int num = 10;    // 错误,两种方式都抓住

public Perosn(int num){//错误,两种方式都抓住

this.num = num;

}

}

3 abstract修饰符

abstract可以修饰类和方法,

abstract修饰类

abstract修饰类称为抽象类。抽象类只能用来声明引用不能用来创建对象。从某种意义上来说,抽象类就是让子类去继承,抽象类声明引用,让这个引用指向子类。子类去实现抽象方法。

抽象类中可以有非抽象方法,但一个类里有抽象方法就一定要是抽象类。子类继承抽象类要么自己成为抽象类,要么实现父抽象类里的所有抽象方法。

abstract修饰方法

abstract修饰方法,称为抽象方法。抽象方法指:只有声明没有实现的方法。

public abstract void  a1();//抽象方法。

public void a1(){};//空实现的方法

abstract class A{

public void a1(){}//抽象类中可以有非抽象方法

public abstract void a2();//但有了抽象方法就一定要是抽象类

}

class B extends A{

public void a2(){

System.out.print("子类要么是抽象类,要么实现父抽象类所有的抽象方法");

}

}

public class TestA{

public static void main(){

A a ;//正确,抽象类可以用来引用

a = new A();//错误,A抽象类,抽象类不能用来创建对象

a = new B();//正确

a.a2();//正确

}

}

抽象类最大的作用就是,定义功能,具体实现由子类实现。

其充分体现了共性放在父类,这个基本原则里。抽象和多态是联系紧密的,其思想大家可以参考JAVA三大特性。

限于文章篇幅原因,这里仅仅介绍冰山一角。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

以上内容希望对大家有所帮助。欢迎讨论,共同进步。

转载于:https://blog.51cto.com/zhangdongxu/1920716

3分钟弄明白JAVA三大修饰符相关推荐

  1. java的修饰符_java默认的修饰符是什么

    默认什么都不加,就是default(不用把default写出来). 意思就是只能由跟这个类在同一个包中的类来访问,比private限制更少,但比protected限制更多.' Java访问修饰符包括p ...

  2. java默认修饰符_java默认方法的修饰符是什么

    默认什么都不加,就是default(不用把default写出来). 意思就是只能由跟这个类在同一个包中的类来访问,比private限制更少,但比protected限制更多.' Java访问修饰符包括p ...

  3. java默认修饰符_java默认的修饰符是什么

    默认什么都不加,就是default(不用把default写出来). 意思就是只能由跟这个类在同一个包中的类来访问,比private限制更少,但比protected限制更多.' Java访问修饰符包括p ...

  4. java final修饰符_java final修饰符详解,final修饰方法

    之前给大家讲过java final修饰符final修饰变量方面的知识,那么下面要继续给大家讲到的就是final修饰方法方面的知识,一起来了解一下吧. final修饰的方法不能被重写,假如因为一些原因, ...

  5. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

  6. Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

  7. 十八、深入Java 访问修饰符和非访问修饰符

    @Author:Runsen @Date:2019/10/29 Java的修饰符主要分为2类,分别访问修饰符和 非访问修饰符 文章目录 访问修饰符 访问控制四个修饰符 非访问修饰符 成员变量 Stai ...

  8. 抑制java对修饰符的检查_Java 7对抑制异常的支持

    抑制java对修饰符的检查 在JDK 7中 ,向Throwable类( Exception和Error类的父类)添加了一个新的构造函数和两个新方法. 添加了新的构造函数和两个新方法以支持"抑 ...

  9. 详解java访问修饰符

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

最新文章

  1. 2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等
  2. spring aop使用详解
  3. 解決BufferedReader读取UTF-8文件中文乱码(转)
  4. [云炬创业基础笔记]第七张创业资源测试11
  5. IIS集成模式和经典模式 系统部署的不同
  6. google浏览器 隐藏功能开启
  7. 直博5年!叹我年少轻狂!头4年一篇1作SCI也没有...
  8. 异常在哪一层处理_WiFi速度慢,信号不稳定,除了重启路由器外,自己能怎么处理?...
  9. 显示多个页面退出登陆_软件测试小白如何第一次登陆时给LINUX的配置网络
  10. Django笔记:ORM模型
  11. 有关SQL Server中日期的常见问题解答
  12. sql2005各种版本
  13. 怎么从抖音上直接跳转到微信呢?
  14. 如何免费搭建FTP服务器---金万维
  15. 【金融项目】尚融宝项目(八)
  16. 年三十 放鞭炮 驱年兽 迎新春 财运到 兔年大吉
  17. CSDN自动回复灌水乐园帖子-httpClient篇
  18. 7-3 奥运排行榜(25 分)
  19. uni-app 即时聊天:朋友圈
  20. 阿里云服务器与腾讯云服务器优势比较哪个好?

热门文章

  1. python自定义函数数据分析_Python实现自定义函数的5种常见形式分析
  2. Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )
  3. 10 个实用的 GitHub 插件
  4. springboot+dynamic多数据源配置
  5. gentoo hibernate
  6. FPGA构造spi时序——AD7176为例(转)
  7. JVM——Java内存区域相关3
  8. Java编译过程、c/c++编译过程区别
  9. js-比较两个日期的大小
  10. linux nohup命令