如果有人问你: "子类继承父类所有非私有(private)的属性和方法这句话对吗?", 如果你回答对的, 那我只能说too young too simple!

关于代码块和成员变量初始化的问题你清楚吗?请看这里

修饰符的问题

  为什么说这句话不对了, 只要你搞清楚了4个访问修饰符的应用范围你就知道了

  public: 任何地方都能访问

  private: 类访问符(自己取得名字), 只要在本类中的都可以访问, 其他类中不可以访问

  默认: 即不加修饰符的时候, 这时候是包访问符, 只要在本包中的都可以访问, 其他包不可以访问(其他包中的子类也不可以访问, 这也正是和protected的区别)

  protected: 默认+非同包的子类, 即可以在本包和非同包的子类中访问, 在非同包的非子类中不可以访问

  可以自己写个案例验证一下, 也有助于自己更好的理解, 那我再问: "实现类'继承'父接口的所有非私有的属性和方法对吗?", 如果你受到上面的启发脱口而出'不对', 那你就要仔细思考一下了. 首先这个问题就有问题, 因为接口中的属性默认被public static final修饰, 接口中的方法默认被public abstract修饰, 所以接口中没有私有的属性和方法, 所以说"实现类'继承'父接口中所有的属性和方法"是对的.

  怎么验证呢?

    static: 验证在实现类中是否能被类名直接调用

    final: 验证在实现类中是否能修改属性的值

    abstract: 试着在接口中写一个具体的方法

    public: 这个就不用说了吧

  

代码块的问题

  掌握java中的代码块有时对我们是很有帮助的, 主要有静态块(格式为static{doSomething})和构造块(格式为{doSomething}), 他们都是定义在类中的, 很简单, 通过下面的一个例子相信你就会完全了解了

  1. public class CodeBlock {
  2. private String code = "code";
  3.  
  4. static{
  5. System.out.println("我是静态代码块");
  6. }
  7.  
  8. {
  9. System.out.println("我是构造代码块");
  10. }
  11.  
  12. public CodeBlock(){
  13. System.out.println("我是无参构造方法");
  14. }
  15.  
  16. //输入说明一切, 当然用调试模式看的更清楚
  17. public static void main(String[] args) {
  18. System.out.println("开始执行main方法");
  19. new CodeBlock();
  20. System.out.println("-----------分割线-----------");
  21. new CodeBlock();
  22. }
  23. }

  自己执行一下, 看一下输出结果你就会发现结论是这样的: 静态块在加载类的时候执行, 而且只执行一次. 构造块在每次调用构造方法的时候都会执行, 所以构造块在构造方法之前执行. 他们执行的优先级: 静态块 > main方法 > 构造块 > 构造方法.

  可是我为什么要在这里加一个成员变量呢?我不知道你有没有这样的疑惑, 因为这和我接下来要讲的有关. 在讲之前先扯点淡, 我们都知道java中的变量在使用之前是要初始化的, 那么你真的清楚成员变量是在什么时候初始化的么?(老鸟请无视), 不要问我局部变量何时初始化的, 那可不就是在执行到他的时候初始化的嘛!好, 回到刚才代码块的这个案例中.

  没有用static修饰的成员变量也叫'实例变量', 对, 你从他的名字可能已经猜到了实例变量初始化的时机: 实例变量和构造块类似, 每次调用构造方法的时候都会执行初始化, 更具体的是在调用构造方法并调用完父类的构造方法之后, 不过他的优先级比构造块高点, 所以结合代码块一起看, 他们的优先级是: 静态块 > main方法 > 实例变量 > 构造块 > 构造方法.

static理解

  但是如果成员变量被static修饰呢?这时候就应该叫类变量了, 顾名思义, 类变量在类加载的时候就被初始化了. 在类中被static修饰的成员(变量, 方法, 代码块)在类加载的时候就被初始化并放到内存中, 系统会在内存中专门开辟出一块区域来存储他们, 以后就算创建类的实例, 静态成员也还是在那儿. 也就是说, 静态成员在类初始化一次后, 系统就不会为他们开辟新的内存空间. 而每new一个类的对象, 系统就会重新在堆内存中开辟一个新空间来存放该类的实例对象, 并且栈中也会有一个新的引用变量去指向它. 一个类的静态成员是被这个类的所有实例所共享的. 讲到这又想起来一个问题: 在静态方法中不能直接调用非静态方法. 因为静态方法随着类的加载而被加载到了内存中, 而非静态方法(实例方法)是在创建类的实例后才被加到内存中的, 所以假如在静态方法中直接调用非静态方法, 静态方法: "咦, 我要调用的这个方法不存在啊!", 但是在静态方法中new一个对象来调用非静态方法是肯定可以的. 关于static可以参考这里, 我觉得解释的比较好. 如果你还是有点懵懵的, 那就来个例子, 再加深一下理解.

  碗类:

  1. public class Bowl {
  2. Bowl(int marker){
  3. System.out.println("碗的数量"+marker);
  4. }
  5.  
  6. void f1(int marker){
  7. System.out.println("f1方法"+marker);
  8. }
  9. }

  碗柜类:

  1. public class Cupboard {
  2. Bowl bowl3 = new Bowl(3);
  3. static Bowl bowl4 = new Bowl(4);
  4.  
  5. Cupboard(){
  6. System.out.println("这是碗柜的无参构造");
  7. bowl4.f1(2);
  8. }
  9.  
  10. void f3(int marker){
  11. System.out.println("这是f3方法, 数量"+marker);
  12. }
  13.  
  14. static Bowl bowl5 = new Bowl(5);
  15. }

  桌子类:

  1. public class Table {
  2. static Bowl bowl1 = new Bowl(1);
  3. Table(){
  4. System.out.println("table的无参构造");
  5. bowl2.f1(1);
  6. }
  7. void f2(int marker){
  8. System.out.println("f2的数量"+marker);
  9. }
  10. static Bowl bowl2 = new Bowl(2);
  11. }

  测试:

  1. /**
  2. * 通过本例了解对象的创建过程及先后顺序
  3. * 在加载类StaticInitialzation时, 静态成员变量table被初始化, 从而导致table所
  4. * 对应的类Table被加载, table中也有静态成员变量, 所以也会被加载, 非静态成员变量(实例变量)是在
  5. * 调用构造方法的时候初始化, 所以在Cupboard中调用构造方法时(调用了构造方法, 但还没有执行
  6. * 构造方法里面的主体代码, 使用调试可以很清楚地看到)才初始化bowl3
  7. */
  8. public class StaticInitialzation {
  9. public static void main(String[] args) {
  10. System.out.println("创建碗柜");
  11. new Cupboard();
  12. System.out.println("再创建一个碗柜");
  13. new Cupboard();
  14. table.f2(1);
  15. cupboard.f3(1);
  16.  
  17. }
  18.  
  19. static Table table = new Table();
  20. static Cupboard cupboard = new Cupboard();
  21.  
  22. static{
  23. System.out.println("我是静态块");
  24. }
  25. }

  自己试一下, 看输出的结果和自己想的是否一样, 打断点调试会比较有帮助.

后面还会更新其他的……

java中易遗忘的知识,不定时更新……的更多相关文章

  1. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  2. [转]java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  3. java中数组的相关知识

      1. 2.数组的命名方法 1)int[]ages=new int[5]; 2) int[]ages; ages=new int[5]; 3)int[]ags={1,2,3,4,5}; 4)int[ ...

  4. Java中的NIO基础知识

    上一篇介绍了五种NIO模型,本篇将介绍Java中的NIO类库,为学习netty做好铺垫 Java NIO 由3个核心组成,分别是Channels,Buffers,Selectors.本文主要介绍着三个 ...

  5. java中易错点

    1.A instanceof  B{这是没有好好利用java多态的表现} java中的二元操作符,测试A对象是否是B类的实例: 返回值:boolean类型 2.“==”与 “equals”的区别: = ...

  6. java中一些常考知识

    一.static的作用 static是修饰符,用于修饰成员变量(静态变量/类变量). static修饰的成员被所有对象共享. static优先于对象存在. static修饰的成员可以用类名.静态成员来 ...

  7. Java专业技能面试问题(不定时更新)

    刚看到园友五月的仓颉<面试感悟----一名3年工作经验的程序员应该具备的技能>感觉很不错,不论是为面试跳槽准备,还是打算深化精进自己的技术都可以参考一下.面向工资编程多少也有点道理,虽然技 ...

  8. Java学习笔记(二)不定时更新

    Java语言画图 package cn.witksy.dev; import javax.imageio.ImageIO; import java.awt.*; import java.awt.ima ...

  9. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

随机推荐

  1. 基于RN开发的一款视频配音APP(开源)

    在如今React.ng.vue三分天下的格局下,不得不让自己加快学习的脚步.虽然经常会陷入各种迷茫,学得越多会发现不会的东西也被无限放大,不过能用新的技术作出一些小项目小Demo还是会给自己些许自信与 ...

  2. 访问者模式(visitorpattern)

    /** * 访问者模式 * @author TMAC-J * 在客户端和元素之间添加一个访问者 * 当你需要添加一些和元素关系不大的需求时,可以直接放在访问者里面 * 或者是元素之间有一些公共的代码块 ...

  3. 关于BAPI_PATIENT_CREATE(病患主数据创建)

    第一次使用BAPI,遇到几个问题.现总结如下. CALL FUNCTION 'BAPI_PATIENT_CREATE' EXPORTING client = * INSTITUTION = '*' * ...

  4. Java实现FTP文件与文件夹的上传和下载

    Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...

  5. jira的插件开发流程实践

    怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项目,甲方给予了既定的几种比较常用 ...

  6. keepalived从机接管后主机恢复不抢占VIP

    在lvs+keepalived环境中,为了减小keepalived主从切换带来的意外风险,,设置主机恢复后不抢占VIP.待进行vrrp协议通告备机不可用时切换.主要修改两个地方.(红色部分) 只需修改 ...

  7. Alwayson的IP冲突

    Alwayson的IP冲突 https://social.technet.microsoft.com/Forums/office/en-US/4d50cb1c-eef7-4dcc-b937-3c8eb ...

  8. 初尝Brnshop移植到Linux Mono Jexus环境运行

    brnshop是最近社区上比较火的开源商城. Jexus是Linux上的web服务器,简单说就是Linux的iis吧.特别感谢作者宇内流云的指点 一.根据http://www.cnblogs.com/ ...

  9. 领域驱动设计实战—基于DDDLite的权限管理OpenAuth.net

    在园子里面,搜索一下“权限管理”至少能得到上千条的有效记录.记得刚开始工作的时候,写个通用的权限系统一直是自己的一个梦想.中间因为工作忙(其实就是懒!)等原因,被无限期搁置了.最近想想,自己写东西时, ...

  10. Liunx下配置DNS服务

    当Ping 主机名时可以映射出该主机的IP地址,反之亦然.配置并指定DNS服务器可以快速部署集群,不需要每台主机都去修改HOSTS文件即可实现IP与主机名的相互解析.而在Linux下的DNS是用bin ...