程序人生——Java中类、对象及方法的建议(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的匿名类,并且包含一个初始化块,类似于构造代码块)

建议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进阶(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中类、对象及方法的建议

相关推荐
安之若素^4 分钟前
启用不安全的HTTP方法
java·开发语言
爱coding的橙子8 分钟前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
ruanjiananquan9911 分钟前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
chuanauc38 分钟前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴1 小时前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc7871 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx6 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁