初识Java

这篇博客详述了Java语言的基础知识,包括其面向对象特性、JDK、JRE、JVM的关系、常用开发工具及程序执行流程。博主分享了学习笔记,强调了代码规范,并按章节介绍了Java的核心概念,如数据类型、面向对象、异常处理、多线程等,旨在帮助读者逐步掌握Java编程。
摘要由CSDN通过智能技术生成

博客内容以及相关情况

    本篇博文主要是针对Java语言中所涉及到的语法知识进行阐述。参考内容为尚硅谷对应的Java教程。其中所述内容主要为博主在学习过程中所做的相关笔记,后期会根据其所讲述内容,以及自己开发过程中所遇到的情况和自己的思考不断进行更新,也随时欢迎各位批评指正,分享自己的学习收获。

综述

    博客将按照目前尚硅谷课程所划分的课程章节进行叙述和分享,各章节划分情况如下:

  1. 第一章 Java语言概述 ,本章主要是阐述了Java语言整体的结构情况,给出其特点和核心机制。同时通过采用txt编辑的形式,还原程序在编辑器中所经历的编译和执行过程。不仅如此,本章会提供Java语言的书写规范。作为一名程序员,养成良好的书写代码的习惯是非常重要的
  2. 第二章 Java基本语法, 本章主要是阐述了Java语言中最基本的语法,给出基本数据类型及程序流程控制中的基本结构。这一章最重要的是明确编写代码中手里对应的“工具”,并且清楚各个工具的使用场景及一些细节问题
  3. 第三章 数组 ,本章主要是阐述了众多数据类型中具体的一种,以及常见的一些简单的数据结构方面的问题。为了使本章的内容更加全面和深刻,在阐述本章内容的同时,会穿插着数据结构的相关内容进行讲解。相信这样能够充分地体现该数据类型的重要程度和地位。
  4. 第四章 面向对象 ,本章的内容非常庞大,在所参考的Java教程中,将这一章的讲述分为了三章进行讲解,但是博主希望读者在初学的过程结束之后,自己进行总结和梳理的过程中,能够将三章进行合并,这样将有助于对于面向对象整体的把握和运用,同时也要注重细节。博主在学习的过程中认为,这一章应是Java语言最核心的部分
  5. 第五章 异常处理 ,本章在博主学习记笔记的过程中,发现所占的篇幅并不是很大,主要是围绕两种常见的处理方式进行讲解。而博主本身也是初学,因此对于本章并没有过多的深究。希望当博主开始重新整理本章内容的时候,能够增加一些更丰富和更深刻的东西进去。
  6. 第六章 多线程 ,本章主要是从操作系统如何处理任务的角度出发,其所述内容相较于前几章而言更偏向于硬件原理,学习过程中可能会有些不知所云。因此,博主在阐述本章时会尽量将原理分析的更加通俗易懂一点。同时,也会将操作系统的内容和一些重点的算法原理与之融合,使本章的基本内容更加充实丰富。
  7. 第七章 枚举类与注解 ,本章的学习相对要轻松一些,重点应该放在对于注解的学习上,博主在后期学习springboot架构的时候才开始明白注解的重要性,但在这里博主将按照所参考的Java教程的深度进行阐述。
  8. 第八章 Java集合 ,在博主整理笔记的过程中,惊奇地发现本章内容的丰富程度并不亚于第四章,这充分地说明了这种结构在Java体系中的重要性。本章的内容很多,初学的过程中应抓住对数据处理的七个操作:增、删、改、查、查询、长度、遍历,来对方法进行归类记忆,而对于其中所述的底层原理,对于初学者而言不要求掌握,讲述的目的在于有意识地去阅读源码,从而在今后的开发学习过程中有更深刻和清晰的了解和认识。
  9. 第九章 泛型,本章主要阐述了泛型的三种结构和具体应用,其中有一些细节需要注意和记忆。
  10. 第十章 IO流,本章主要会从数据输入和输出的角度介绍不同的方法,为了使本章内容更加丰富,在讲述本章的同时,会穿插着计算机组成原理的相关内容进行讲解,使读者能够从理论和实际两个角度更好地了解数据输入和输出。
  11. 第十一章 网络编程,本章的重点在于对于计算机网络中,传输层的理论知识的学习,并且能够学习并掌握对应原理所涉及到的编程所用的方法。
  12. 第十二章 Java反射机制,本章主要是阐述如何对类这种数据类型的进一步理解和使用
  13. 附录

    以上便是Java相关内容的基本介绍。我会尽量将每一章的内容总结的通俗易懂,同时也随时欢迎大家与我沟通交流,希望大家都能一边学习一边整理,一直在路上。现在,就让我们一起开启Java的学习旅程吧~

第一章 Java语言概述


一、本章学习架构

第一章思维导图

    以上是博主根据课程在学习Java语言中,参照所记笔记构建得到的思维导图。但是在撰写博文的时候可能会根据实际情况进行适当的增加、删除亦或是修改。希望读者在看思维导图和博文的时候都能收获不同的东西,同时也能够通过反复强调加深记忆。

二、Java语言的特点

1、面向对象编程(Object-oriented programming, OOP)
    它是一种具有对象概念的编程典范,同时也是一种程序开发的抽象方针。对象指的是类(class)的实例。面向对象编程将对象作为程序的基本单元,将程序和数据封装进去,从而提高软件的可复用性、灵活性和可扩展性。一个具有注脚的文本。1 其主要包含了封装性、继承性、多态性三种特性:

  • 封装性(Encapsulation)
        在面向对象编程方法中,封装性指的是一种将抽象的函数接口进行细节部分的包装和隐藏的方法,同时也可以作为一种防止外界调用/访问内部实现细节的手段。通过实现封装性,可以将程序进行部分隐藏,对用户不可见。不仅如此,也能确保用户无法任意更改对象内部的重要内容。2

  • 继承性(Succession)
        在面向对象编程方法中,如果一个类A继承于另一个类B,那么称类A是类B的子类,类B是类A的父类或者超类。因为具有继承性,可以使子类拥有其父类的各种属性和方法,而不需要重复编写相同的代码,从而极大地优化了程序的代码量。

  • 多态性(Polymorphism)
        在面向对象的程序设计理论中,多态性指的是:同一操作作用于不同的类的实例,将产生不同的执行结果的现象。 换句话说,当不同的类所对应的对象接收到相同的“消息”的时候,会得到不同的结果。
        多态性包含编译时的多态性和运行时的多态性两个大类,当然也可以称为静态多态性和动态多态性两种:
    (1)静态多态性
        静态多态性是指定义在一个类,亦或是一个函数中的同名函数,依据函数的形参表(类型以及个数)来进行区分,并通过静态联编来实现。
    (2)动态多态性
        动态多态性是指定义在一个类层次的不同类中的重载函数,由于它们具有相同的函数,因此需要根据指针所指向的对象所在类来区分,并通过动态联编来实现。

// 建立两个类,并让其之间成为子父类关系

public class Parent{ //基类
	public static String pic = "parent"; //成员变量
	
	public Parent(){ //空参的构造函数
		System.out.println("Parent initialzed");
	}
	public void draw(){ //动态联编
		System.out.println("Parent draw " + pic);
	}
	public static void drawStatic(){ 
		//静态联编
		System.out.println("Parent drawStatic" + pic);
	}
}

public class Child extends Parent{  //子类
	public static String pic = "Child"; //成员变量
	
	public Child(){ //空参的构造函数
		System.out.println("Child initialized ");
	}
	public void draw(){  //动态联编
        System.out.println("Child draw "+ pic);
	}
	public static void drawStatic(){  //静态方法测试 静态联编
		System.out.println("Child drawStatic "+ pic);
	}
}

//编写测试方法
public class Test{
	public static void main(String[] pars){
        Parent p_test = new Child(); 
        p_test.write();   //测试动态联编
        p_test.writeStatic();   //  测试静态联编
    }
}

结果分析:上图程序执行结果如下所示,可以看到:

  • 在对子类对象进行构造的时候,需要先调用其父类(超类)的构造函数,在执行本类的构造函数。
  • 对于一般的方法 (这里具体指非静态方法) ,尽管将生成的子类对象转换为父类对象,但是在程序运行的过程中依旧执行的是子类中的方法
  • 对于静态方法而言,由于编译时已经决定了其执行顺序(先静态后非静态,具体内容会在面向对象章节详细阐述,这里仅仅举一个例子来理解性质),因此程序在运行的过程中会执行强制转换后的对象所对应的静态方法。

执行结果展示


2、健壮性(Robustness)
    Java语言的健壮性主要体现在三个方面:
    (1)相对于C语言而言,Java舍弃了指针的使用,从而能够更好地避免了滥用指针导致程序崩溃的现象。
    (2)Java语言增加了自动的垃圾回收机制(即释放“垃圾”所占用的内存空间,从而有效地防止内存泄露,保证内存的有效使用)。那么如何确定什么是“垃圾”呢?具体步骤应分为两步:① 发现并确定无用的信息对象 ② 回收被无用对象占用的内存空间,使该空间可被程序再次使用。这里提供一种比较古老的方法供大家分析和理解 (由于本节主要是了解个大概,因此博主在撰写这部分的过程中可能不会讲的那么详细,如果后期需要博主会单独进行补充。)

  • 引用计数法(Reference Counting Collector)3
        引入计数法作为垃圾收集机制的早期方法。在该方法中,会为堆中的每个对象实例提供一个引用计数器,当该对象第一次被创建,并且将其赋值给一个变量时,则引用计数器置为1。后期如果有任何其他的变量被赋值为该对象的引用时, 引用计数器会自动加1;而如果该对象实例的某个引用超过了其生命周期或者被设置为一个新值时,引用计数器会自动减1。一旦引用计数器变为0,则该对象实例可以作为垃圾收集。
        而当一个对象实例被当作垃圾进行收集时,它所引用的任何对象实例的引用计数器也需要自动减1
        这种方法的优点就在于,引用计数器可以很快地执行,比较适用于程序交替运行,且需要不被长时间打断的实时环境。而它所存在的不足则在于:无法检测出循环引用,如下所示:
public class Main {
    public static void main(String[] args) {
        MyObject object1 = new MyObject();
        MyObject object2 = new MyObject();
         
        object1.object = object2;
        object2.object = object1;
         
        object1 = null;
        object2 = null;
    }
}

    从以上程序可以看出,由于程序最后两句是分别给object1 和 object2 赋值为null,换句话说,在此之后object1和object2指向的对象已经不可能再被访问,但是由于两者之间互相引用对方,导致其引用计数器都不为0,因此垃圾收集器就永远不会将其回收。

    (3)Java语言具有强类型机制、异常处理和安全检查机制

  • 强类型机制:这里指的强类型机制应指的是Java是一种强类型语言。它要求任何变量在使用的时候必须指定该变量的类型,而在程序的运行过程中该变量也只能存储这个类型的数据。因此,对于强类型语言而言,变量如果不通过强制转换的手段,是不可能改变其数据类型的,并且也不允许隐式的类型转换。
  • 异常处理(该内容将会在第五章进行详细讲解)
  • 安全检查机制(该内容将会在第五章进行详细讲解)

3、跨平台性(Cross-Platform)4
    简洁地说,跨平台性就是:Compile once and run everywhere.(一次编译,随处运行~)。在了解这个性质之前,首先需要明确平台这个概念,我们称CPU处理器与操作系统的整体为平台,即平台 = CPU + OS
    接下来,结合下图来了解什么是跨平台性:


C语言关于平台的描述
    如果之前有过C语言的学习亦或是开发经历,那可以清楚地知道,使用标准C语言开发的程序,通过使用不同的编译器进行编译之后,所生成的可执行文件是可以在相应的平台进行运行的。(例如:利用VC编译,所产生的.exe文件可以在windows下运行;利用gcc编译,所产生的可执行文件可以在Linux上运行。但是,相应的,.exe文件是不能在Linix上运行;而由gcc编译所产生的可执行文件是不能在Windows上执行的。


    基于此,我们再来看看Java跨平台原理:Java跨平台原理
    相比于C语言的解释运行过程而言,可以发现Java的源程序在进行编译的过程中会生成与平台无关的中间码。这也就意味着不同平台的解释器可以根据平台自身将中间码进行解释执行。这也充分体现了Java语言本身的跨平台性。

三、JDK、JRE、JVM及其之间的关系

  • JDK(Java Development Kit):作为Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个Java开发的核心,它包含了Java的运行环境和Java工具。5
  • JRE(Java Runtime Environment):作为一个软件,它可以让计算机系统运行Java应用程序。内部包含一个Java虚拟机(Java Virtual Machine, JVM)以及一些标准的类别函数库(Class Library)。6
  • JVM(Java Virtual Machine):是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java虚拟机后,Java语言在不同平台上运行时不需要重新编译。 Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。7

    这里借用尚硅谷Java课程中的一张图来阐述JDK、JRE、JVM之间的关系:
JDK、JRE、JVM之间的关系

  • JDK = JRE + 开发工具集
  • JRE = JVM + Java SE标准类库

五、常用的Java开发工具

    常用的Java开发工具主要分为两类:

  • 文本编辑工具:记事本、UltraEdit、EditPlus、TextPad、NotePad

  • Java集成开发环境(Integrated Development Environment, IDE):JBuilder、NetBeans、Eclipse、MyEclipse、IntelliJ IDEA

六、Java程序编写 - 编译 - 运行的过程

    这里尝试使用txt文件来还原Java程序的编写 - 编译 - 运行过程,而具体的JDK的安装步骤将不在这里赘述,大家可以参考其他博客进行安装。

  • 编写:将写好的Java代码放入以“.java”结尾的源文件中。(这里是先创建一个以.txt结尾的文本文件,将对应的Java代码输入进去,然后再将后缀更改为.java)
  • 编译:指的是利用编译程序从源语言编写的源程序产生目标程序的过程,即把高级语言变成计算机可以识别的二进制语言(因为计算机只认识1和0)。使用javac.exe编译Java源文件 (这里注意应将命令行的地址定义到文件所在的目录) ,编译命令行格式:
 javac 源文件名.java
  • 运行:使用java.exe解释运行编译所生成的字节码文件,运行命令行格式:
 java 类名

七、Java语言书写规范

  • 包名:所有的字母都小写。
  • 类名、接口名:所有单词的首字母大写。
  • 变量名、方法名:第一个单词的首字母小写,第二个单词开始,每个单词首字母大写。
  • 常量名:所有字母大写,且每个单词用下划线连接。

  1. 参考自链接: https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1. ↩︎

  2. 参考自链接: https://zh.wikipedia.org/wiki/%E5%B0%81%E8%A3%9D_(%E7%89%A9%E4%BB%B6%E5%B0%8E%E5%90%91%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88). ↩︎

  3. 参考自链接: https://www.cnblogs.com/sunniest/p/4575144.html. ↩︎

  4. 参考自链接: https://blog.csdn.net/u012341052/article/details/45786109. ↩︎

  5. 参考自链接: https://baike.baidu.com/item/jdk/1011?fr=aladdin. ↩︎

  6. 参考自链接: https://baike.baidu.com/item/JRE/2902404?fr=aladdin. ↩︎

  7. 参考自链接: https://baike.baidu.com/item/JVM/2902369?fr=aladdin. ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值