CSDN第一帖----java学习笔记

CSDN第一帖----java基础

前言

2020年九月开启了研究生生涯,在这半年多的时间里学习了很多新知识,也找到了以后要努力的方向,新学期开始,想用此帖整理一下上学期学的知识,对自己也是一个回顾。

JVM、JRE和JDK

jvm 就是一个用于执行字节码的虚拟机。我们编写的java程序编译成字节码,然后给jvm,jvm在跟操作系统打交道。
jre 包含Java虚拟机、库函数、运行java应用程序所必须的文件。
jdk 包含jre,以及增加编译器和调试器等用于程序开发的文件。
总结:
JDK = JRE+JAVA开发工具
JRE = JVM+JAVA核心类库

  • jvm的类加载机制
    程序写好,通过javac进行编译之后,通过java启动虚拟机然后对类进行加载和执行
    类加载过程:加载、链接、初始化 、使用、卸载
    静态块最优先执行,类只加载一次。

加载:将class文件字节码内容加载到内存中,这些class文件通过类加载器转化成方法区中的运行时的二进制运行时的数据结构(也就是说, 在class文件里面是静态数据结构,经过类加载器加载之后变成了方法区中的二进制数据结构),同时在堆里面 会生成一个代表这个类的Class对象(也就是反射里面的反射对象),这个Class对象就像一个镜子一样,可以指向方法区中的类加载的二进制运行时的数据,如果外部要访问这些类的结构数据只能通过class对象来访问,这就是反射对象的核心内容。类加载就是你进来的是.class文件,经过类加载之后,在方法区里面会有二进制的类的数据,同时堆里面也有了一个这个类的Class对象。

链接:就是将刚才加载进来的二进制字节码合并到虚拟机(JVM)的运行的状态里面,从静态的数据变成运行时的数据,可以被运行,链接包含下面三部分。

    - 验证:确保加载的类的信息符合虚拟机的规范,没有安全方面的问题。 
    -准备:正式的为类变量(static变量)在方法区中分配内存,赋默认值。
    -解析:虚拟机中常量的符号引用替换为直接引用(符号引用比较抽象,直接引用比较具体)

初始化:初始化就是执行类构造器clinit(),并不是我们自己定义的对象的构造器,而是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{})中的语句合并产生的,自父向下初始化。
虚拟机会保证一个类的clinit()方法在多线程环境中被正确加锁和同步。也就是说虚拟机在加载类的时候肯定是线程安全的,
类的主动引用(一定会发生初始化):包括new()一个对象、调用类的静态成员(除了final常量,因为常量是放在常量池里面的)和调用静态方法、通过反射加载类、有父类先初始化父类。
类的被动引用(不会发生类的初始化):引用类中的数组、引用类中的常量、当访问一个静态域时只有真正声明这个与的类才会被初始化(也就是说,子类继承父类,我通过子类调用父类中的静态变量,不会使子类进行初始化,当然会初始化父类。)

  • jvm的类加载器的树状结构
  • 在这里插入图片描述
    启动类加载器使用C++编写的,没有父类
    扩展类加载器、应用程序类加载器、自定义类加载器都是用java语言来写的,都是继承java.lang.ClassLoader
    虽然启动类加载器是扩展类加载器的父亲,扩展类加载器是应用程序类加载器的父亲,应用程序类加载器是自定义类加载器的父亲,但是他们之间并不是简单的继承关系,而是用组合的方式来实现的。至于什么是组合后面再细说。
    java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个java类,就是java.lang.Class类的一个实例。除此之外,ClassLoader还负责加载java应用所需要的资源和配置文件。

双亲委托机制:就是某个特定的类加载器在接到加载类的请求是,首先将加载任务委托给父类加载器,依次追溯,直到最高的爷爷辈。如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务是才自己去加载。比如说我自定义了一个string类,我想加载这个自定义的string类,我告诉自定义类加载器我要加载string类,自定义类加载器告诉应用程序类加载器,依次向上追溯,到了启动类加载器这块,他发现自己的库中有string类,就加载了string类,如果引导类加载器中没有string类,就依次向下来,如果最后自定义加载器中也没有string类,就会报错。
双亲委派机制是代理模式的一种,保重了java核心库的类型安全。并不是所有的类加载器都采用双亲委托机制。tomcat服务器类加载器也是用代理模式,不同的是他让子类先进行类加载,子类加载不了在给父类。

内存简化结构-----堆、栈和方法区

:此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。例如存储创建好的对象和数组。jvm只有一个堆,被所有线程共享。堆是一个不连续的内存空间,分配灵活,速度慢。
:是指虚拟机栈。栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈(存储局部变量、操作数、方法出口等)。jvm为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等),方法执行完自动释放栈。栈属于线程私有不能实现线程间的共享。栈的存储特性是“先进后出,后进先出”。栈是由系统自动分配,速度快。栈是一个连续的内存空间。
方法区:又称静态区。用来存放程序中永远不变或唯一的内用(静态变量、字符串常量、类的加载信息等)。jvm只有一个方法区,被所有线程共享。方法区实际也是堆,只是用来存放特定的信息。

例如:new了一个新数组,数组的内容放在堆中,将数组名字和堆中的数组内容的地址一起存入到栈中

数据类型及所占字节

在这里插入图片描述
java中定义了3类8种基本数据类型

  • 数值型 :byte(1位字节)、short(2位)、int(4位)、long(8位)、float(4位)、double(8位)
  • 字符型:char(2位)
  • 布尔型:boolean(1位)

此外引用数据类型占4个字节。
整型数组的默认初始化值为0;浮点型数组元素的默认值是0.0;char型默认值是0;而不是’0’;boolean型的默认值是false;String型默认值是null;

super、this关键字的使用

  • super理解为父类的。是直接父类对象的引用。可以同通过super来访问父类中被子类覆盖的方法或属性。
  • this的本质就是“创建好的对象的地址”,由于在构造放方法调用前,对象已经创建。因此在构造方法中也可以使用this代表“当前对象”。。。this最常用法,在程序中产生二义性之处,应使用this来指明当前对象。this不能用于static方法中。
  • 当父类和子类中均有同名属性的时候,可以用this和super进行区分。当什么都不加的时候是默认this
  • super();表示调用父类中的无参构造器。this();表示调用当前类的无参构造器,不能调用自己,且super();和this();只能在类的构造器中二选一,不能同时出现,且必须放在构造器的第一行;在构造器的首行既没有显示的声明this(形参列表)也没有super(形参列表),会默认有一个super();你写不写他都在,这是调用父类中的无参构造器。

多态性

多态性 :(多态和继承区别)父类的引用指向子类的对象,也就是说用父类的对象new一个子类,当调用子父类同名同参数的方法是实际执行的是子类重写父类的方法。编译看左边,运行看右边。。。。子类要有父类方法的重写,父类中被重写的方法称为虚拟方法(虚方法)。多肽不适用于属性。多肽是编译时的行为,多肽的时候不能调用子类中特有的方法或属性,原因就是:是父类的类型,那么如何调用多肽中子类特有的属性和方法呢?就要用向下转型,将父类的对象强转为子类对象。。。为了避免向下强转错误,可用instanceof关键字,例如a instanceof A判断a是不是A的子类,是的话返回true,

向上转型(多态):

		 public class Dog extends Pet
         Pet myBaby = new Dog();
         

父类引用指向子类对象,只能调用父类中的方法。子类可以当做父类使用。

向下转型:首先利用关键字instanceof来判断能不能进行强制转换。

		Dog snoopy = (Dog)myBaby;

总结:
1、多态与属性无关
2、多态的存在要有3个必要条件:继承、方法重写、父类引用指向子类对象。

垃圾回收机制

垃圾回收机制关键点
1、垃圾回收机制只回收JVM堆内存中的对象空间
2、对其他物理连接,比如数据库连接、输入输出流、Socket连接无能为力
3、现在的JVM有多种垃圾回收实现算法,表现各异
4、垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制的执行
5、可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象
6、程序员可以通过System.gc()或者Runtime.getRuntime().gc来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。
7、垃圾回收机制回收任何对象前,总会先调用他的finalize方法(如果覆盖该方法,会让一个新的引用变量重新引用该对象,则会重新激活该对象)。
8、永远不要主动调用某个对象的finalize 方法,应该交给垃圾回收机制调用。

https://blog.csdn.net/weixin_41412455/article/details/104969409?spm=1001.2014.3001.5501
这篇博客有垃圾回收算法的详细解释这里就不在赘述。

  • final、finally、finalize区别
    final 关键字 用于属性前表示不可更改
    finally 关键字 用于异常处理try catch finally ,finally表示最后必然会运行的代码
    finalize 表示垃圾回收前会调用finalize方法,

初学java,若有错误还请多多指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值