码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 程序人生——Java中类、对象及方法的建议(1)


    在这里插入图片描述

    目录

    • 引出
    • 类、对象及方法
      • 建议31:在接口中不要存在实现代码
        • 建议32:静态变量一定要先声明后赋值
        • 建议33:不要覆写静态方法
        • 建议34:构造函数尽量简化
      • 建议35:避免在构造函数中初始化其他类
        • 建议36:使用构造代码块精炼程序
        • 建议37:构造代码块会想你所想
      • 建议38:使用静态内部类提高封装性
        • 建议39:使用匿名类的构造函数
        • 建议40:匿名类的构造函数很特殊
    • 深入认识JVM
      • JVM内存分配,类加载
      • 创建对象的4种方法总结
      • 垃圾回收GC
      • JVM调优,Arthas使用
    • 认识多线程
      • 创建多线程方法+了解线程池
      • 多线程下-1非原子性问题即解决
      • 再论线程,创建、生命周期
    • 总结

    引出

    程序人生——Java中类、对象及方法的建议(1)


    类、对象及方法

    建议31:在接口中不要存在实现代码

    • 可以通过在接口中声明一个静态常量s,其值是一个匿名内部类的实例对象,可以实现接口中存在实现代码

    建议32:静态变量一定要先声明后赋值

    • 也可以先使用后声明,因为静态变量是类初始化时首先被加载,JVM会去查找类中所有的静态声明,然后分配空间,分配到数据区(Data Area)的,它在内存中只有一个拷贝,不会被分配多次,注意这时候只是完成了地址空间的分配还没有赋值,之后JVM会根据类中静态赋值(包括静态类赋值和静态块赋值)的先后顺序来执行,后面的操作都是地址不变,值改变

    建议33:不要覆写静态方法

    • 一个实例对象有两个类型:表面类型和实际类型,表面类型是声明时的类型,实际类型是对象产生时的类型。对于非静态方法,它是根据对象的实际类型来执行的,即执行了覆写方法。而对于静态方法,首先静态方法不依赖实例对象,通过类名访问;其次,可以通过对象访问静态方法,如果通过对象访问,JVM则会通过对象的表面类型查找到静态方法的入口,继而执行

    建议34:构造函数尽量简化

    • 通过new关键字生成对象时必然会调用构造函数。子类实例化时,首先会初始化父类(注意这里是初始化,可不是生成父类对象),也就是初始化父类的变量,调用父类的构造函数,然后才会初始化子类的变量,调用子类自己的构造函数,最后生成一个实例对象。构造函数太复杂有可能造成,对象使用时还没完成初始化

    建议35:避免在构造函数中初始化其他类

    • 有可能造成不断的new新对象的死循环,直到栈内存被消耗完抛出StackOverflowError异常为止

    建议36:使用构造代码块精炼程序

    • 四种类型的代码块:
      • **1、普通代码块:**在方法后面使用“{}”括起来的代码片段;
      • **2、静态代码块:**在类中使用static修饰,并使用“{}”括起来的代码片段;
      • **3、同步代码块:**使用synchronized关键字修饰,并使用“{}”括起来的代码片段,表示同一时间只能有一个县城进入到该方法;
      • **4、构造代码块:**在类中没有任何的前缀或后缀,并使用“{}”括起来的代码片段。编译器会把构造代码块插入到每个构造函数的最前端。
      • 构造代码块的两个特性:1、在每个构造函数中都运行;2、在构造函数中它会首先运行

    建议37:构造代码块会想你所想

    • 编译器会把构造代码块插入到每一个构造函数中,有一个特殊情况:如果遇到this关键字(也就是构造函数调用自身其他的构造函数时)则不插入构造代码块。如果遇到super关键字,编译器会把构造代码块插入到super方法之后执行

    建议38:使用静态内部类提高封装性

    • Java嵌套内分为两种:1、静态内部类;2、内部类;静态内部类两个优点:加强了类的封装性和提高了代码的可读性。静态内部类与普通内部类的区别:1、静态内部类不持有外部类的引用,在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。而静态内部类,则只可以访问外部类的静态方法和静态属性,其他则不能访问。2、静态内部类不依赖外部类,普通内部类与外部类之间是相互依赖的关系,内部类不能脱离外部类实例,同声同死,一起声明,一起被垃圾回收器回收。而静态内部类可以独立存在,即使外部类消亡了;3、普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制

    建议39:使用匿名类的构造函数

    • List l2 = new ArrayList(){}; //定义了一个继承于ArrayList的匿名类,只是没有任何的覆写方法而已
    List l3 = new ArrayList(){{}}; //定义了一个继承于ArrayList的匿名类,并且包含一个初始化块,类似于构造代码块)
    
    • 1

    建议40:匿名类的构造函数很特殊

    • 匿名类初始化时直接调用了父类的同参数构造器,然后再调用自己的构造代码块

    深入认识JVM

    JVM内存分配,类加载

    Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    在这里插入图片描述

    创建对象的4种方法总结

    Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

    在这里插入图片描述

    垃圾回收GC

    在这里插入图片描述

    Java进阶(垃圾回收GC)——理论篇:JVM内存模型 & 垃圾回收定位清除算法 & JVM中的垃圾回收器

    简介:本篇博客介绍JVM的内存模型,对比了1.7和1.8的内存模型的变化;介绍了垃圾回收的语言发展;阐述了定位垃圾的方法,引用计数法和可达性分析发以及垃圾清除算法;然后介绍了Java中的垃圾回收器,由串行、到并行再到并发,最后到G1的演变;最后给出了垃圾回收器的对比和使用指引。

    JVM调优,Arthas使用

    • Java进阶(JVM调优)——阿里云的Arthas的使用 & 安装和使用 & 死锁查找案例,重新加载案例,慢调用分析
    • Java进阶(JVM调优)——JVM调优参数 & JDK自带工具使用 & 内存溢出和死锁问题案例 & GC垃圾回收

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    认识多线程

    创建多线程方法+了解线程池

    Java进阶(5)——创建多线程的方法extends Thread和implements Runnable的对比 & 线程池及常用的线程池

    在这里插入图片描述

    多线程下-1非原子性问题即解决

    Java进阶(6)——抢购问题中的数据不安全(非原子性问题)& Java中的synchronize和ReentrantLock锁使用 & 死锁及其产生的条件

    在这里插入图片描述

    再论线程,创建、生命周期

    Java进阶(再论线程)——线程的4种创建方式 & 线程的生命周期 & 线程的3大特性 & 集合中的线程安全问题

    主要内容:
    1.线程创建的方式,继承Thread类,实现Runable接口,实现Callable接口,采用线程池;
    2.线程生命周期: join():运行结束再下一个, yield():暂时让出cpu的使用权,deamon():守护线程,最后结束,sleep():如果有锁,不会让出;
    3.线程3大特性,原子性,可见性,有序性;
    4.list集合中线程安全问题,hash算法问题;


    总结

    程序人生——Java中类、对象及方法的建议

  • 相关阅读:
    API阶段测试
    [附源码]计算机毕业设计汽车美容店管理系统Springboot程序
    Algorithm基础算法学习
    栈的三道oj【C++】
    基于minist数据集用VAE训练生成图片(VAE基础入门学习)
    登录页面记住密码如何实现?
    Vue 官方文档2.x教程学习笔记 1 基础 1.4 模板语法 1.4.2 指令
    R语言VLOOKUP数据匹配
    【Proteus仿真】【STM32单片机】智能加湿器设计
    Kubernetes部署(八):k8s项目交付----(5)持续部署
  • 原文地址:https://blog.csdn.net/Pireley/article/details/136653339
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号