Java:基本概念

一些基本 Java 概念,做一个小小小小的记录

面向对象&面向过程

面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。 面向对象的语言中,包含了三大基本特征,即封装、继承和多态。

个人感觉,应该是四大基本特征,应为:抽象、封装、继承、多态

面向对象和面向过程的区别:

  1. 编程思路不同:面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。
  2. 封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能
  3. 面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势很明显。

面向对象的三大特性

  1. 封装:通常认为封装是把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口。

  2. 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类/基类),得到继承信息的被称为子类(派生类)。

  3. 多态:分为编译时多态(方法重载)运行时多态(方法重写)。要实现多态需要做两件事:一是子类继承父类并重写父类中的方法二是用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。

    关于重写和重载,见Java:重载和重写

关于继承的几点补充:

  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和私有方法子类是无法访问,只是拥有。因为在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象;

  2. 子类可以拥有自己属性和方法;

  3. 子类可以用自己的方式实现父类的方法。(重写)

参考:https://mp.weixin.qq.com/s/4E3xRXOVUQzccmP0yahlqA

JDK&JRE&JVM

JDK(Java Development Kit):是 Java 开发工具包,是整个 Java 的核心,包括了 Java 运行环境 JRE、Java 工具(例如:解释器-Java、编译器-Javac)和 Java 基础类库。

JRE( Java Runtime Environment):是 Java 的运行环境,包含 JVM 标准实现及 Java 核心类库。

JVM(Java Virtual Machine):是 Java 虚拟机,是整个 Java 实现跨平台的最核心的部分,能够运行以 Java 语言写的软件程序。所有的 Java 程序会首先被编译为 .class 的类文件,这种类文件可以在虚拟机上执行。

关系如下:

JDK = JRE + 开发工具

JRE = JVM + 类库

总结:

Java程序开发过程为:

  1. 利用 JDK(调用 Java API)编写出 Java 源代码,存储于 .java 文件中;
  2. JDK 中的编译器 Javac 将 Java 源代码编译成Java字节码,存储与 .class 文件中;
  3. JRE 加载,验证,执行 Java 字节码;
  4. JVM 将字节码解析为机器码并映射到 CPU 指令集或者 OS 的系统调用。

参考:

https://mp.weixin.qq.com/s/4E3xRXOVUQzccmP0yahlqA

https://www.jianshu.com/p/7b99bd132470

字节码&JVM

字节码:

在 Java 中,将虚拟机可以读懂的代码,称为字节码,即 java 中的 .class 文件;

而机器可以读懂的代码为二进制命令,即机器码,即 0/1 组成的文件。

Java程序运行过程如下:

源码(xxx.java)->javac编译器->JVM可执行的字节码(xxx.class)->JVM->机器码->程序执行

采用字节码的好处:

Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

本质上就是采用解释性语言的好处。

编译型语言:

需要通过编译器,将源代码编译成机器码之后才能执行的语言。一般是通过编译和链接两个步骤,编译是将我们的程序编译成机器码,链接是程序和依赖库等串联起来。

优点:编译器一般会有预编译的过程对代码进行了优化,因为编译只做了一次,运行时不会再编译,所以编译型语言效率高。

缺点:编译之后如果想要修改某一个功能,就需要整个模块重新编译。编译的时候根据对应的运行环境生成不同的机器码。不同的操作系统之间,可能会有问题。需要根据环境的不同,生成不同的可执行文件。

代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift,GO

解释型语言:

解释型语言不需要编译,相比编译型语言省了道工序,解释型语言在运行程序的时候才逐行进行翻译。字节码也是解释型的一部分。

优点:有良好的平台兼容性,只要安装了虚拟机,就可以。容易维护,方便快速部署,不用停机维护。

缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。

代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

虚拟机:

Java中引入了虚拟机(JVM)的概念,就是在机器和程序之间加入了一层抽象的虚拟机器。这台机器在各个平台中都给程序提供了接口。因此,编写 Java 程序只需要面向虚拟机编程。

参考:https://blog.csdn.net/a4171175/article/details/90735888

& 和 &&

Java 中 && 和 & 都是表示与的逻辑运算符,都表示逻辑运输符 and,当两边的表达式都为 true 的时候,整个运算结果才为 true,否则为 false。

&&:有短路功能,当第一个表达式的值为 false 的时候,则不再计算第二个表达式

@Test
public void test02(){
String str = "a";
int i = 0;
if(str != "a" && (i++) == 1){
;
}
System.out.println(i); // 由于短路缘故,i=0
if(str!="a" & (i++)==1){
;
}
System.out.println(i); // 还是执行i++,故i=1
}

&:不管第一个表达式结果是否为 true,第二个都会执行

除此之外,& 还可以用作位运算符:当 & 两边的表达式不是 Boolean 类型的时候,& 表示按位操作。

// 位运算
@Test
public void test03(){
int a = 1; // 01
int b = 3; // 11
int c = a & b; // 01&11=01
System.out.println(c); // 01
}

两个二进制数的异或结果

两个二进制数异或结果是这两个二进制数差的绝对值。表达式如下:a^b = |a-b|

两个二进制 a 与 b 异或,即 a 和 b 两个数按位进行运算。如果对应的位相同,则为 0(相当于对应的算术相减),如果不同即为 1(相当于对应的算术相加)。由于二进制每个位只有两种状态,要么是 0,要么是 1,则按位异或操作可表达为按位相减取绝对值,再按位累加。

例如3和5进行异或
3:0011 ^ 5:0101 ---> 按位相减取绝对值,再按位累加
0-0=0
0-1=-1 ---> 取绝对值为1
1-0=1
1-1=0
---> 按位累加:0110=6

Java环境变量PATH 和 CLASSPATH

Java环境变量PATH:

其作用是指定命令搜索路径,例如在运行javac/java命令时,会根据 PATH 环境变量指定的路径中查看是否能找到命令对应的程序;

在 windows 平台中,通过如下配置即可:

  1. 在环境变量中添加JAVA_HOME,它指向jdk的安装目录,Tomcat 等软件就是通过搜索 JAVA_HOME 变量来找到并使用安装好的jdk,如下:

    变量名(N):JAVA_HOME
    变量值(V):C:\Software\Java\jdk1.8.0_241(即jdk安装路径)
  2. 编辑环境变量,添加如下即可

    %JAVA_HOME%\bin
  3. 在执行 java/javac 等命令时,会根据上述配置的路径找到相应的 exe 程序执行

CLASSPATH环境变量:

CLASSPATH环境变量的作用是指定 Java 类所在的目录,即指定类搜索路径;JVM 就是通过 CLASSPTH 来寻找类的;

而目前是不需要进行配置的。

例如:

  1. 在某文件夹下创建个.java文件

    class HelloWorld{
    public static void main(String args[]){
    System.out.println("hello world");
    }
    }
  2. 通过命令生成字节码文件:javac HelloWorld.java,生成的字节码文件在同个文件夹下;

  3. 通过java HelloWorld运行即可

从上述可知,此时 cmd 所在的路径即为 CLASSPATH 路径,因此可以直接通过命令 java HelloWorld 运行 .class 字节码文件;

参考:

https://blog.csdn.net/lizhensen/article/details/79262564

https://www.jianshu.com/p/d63b099cf283

参数传递

值传递 Or 引用传递?

Java 的参数是以值传递的形式传入方法中,而不是引用传递;Java 语言的参数传递只有值传递。

当传递方法参数类型为基本数据类型(数字以及布尔值)时,一个方法是不可能修改一个基本数据类型的参数。

private static void changeNum(int num){
num = 2;
} public static void main(String[] args) {
int num = 1;
System.out.println("num在调用方法前:" + num); // num在调用方法前:1
changeNum(num);
System.out.println("num在调用方法后:" + num); // num在调用方法前:1
}

当传递方法参数类型为引用数据类型时,一个方法将修改一个引用数据类型的参数所指向对象的值。即 Java 函数在传递引用数据类型时,也只是拷贝了引用的值罢了,之所以能修改引用数据是因为它们同时指向了一个对象,但这仍然是按值调用而不是引用调用。

// 传入的值为指向stringBuffer对象的地址,即str与stringBuffer指向同一块区域
private static void change(StringBuffer str){
str.append(", world!");
} public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("hello");
System.out.println("在调用方法前:" + stringBuffer); // hello
change(stringBuffer);
System.out.println("在调用方法前:" + stringBuffer); // hello, world!
}
// String为不可变类
private static void change(String str){
str = str + ", world!"; // 产生了一个新的String对象,原对象并未被修改
} public static void main(String[] args) {
String string = "Hello";
System.out.println("在调用方法前:" + string); // Hello
change(string);
System.out.println("在调用方法前:" + string); // Hello
}

参考:https://blog.csdn.net/qq_22408539/article/details/82945990

Java:基本概念小记的更多相关文章

  1. Java:AQS 小记-1(概述)

    Java:AQS 小记-1(概述) 概述 全称是 Abstract Queued Synchronizer(抽象队列同步器),是阻塞式锁和相关的同步器工具的框架,这个类在 java.util.conc ...

  2. Java:ThreadLocal小记

    Java:ThreadLocal小记 说明:这是看了 bilibili 上 黑马程序员 的课程 java基础教程由浅入深全面解析threadlocal 后做的笔记 内容 ThreadLocal 介绍 ...

  3. Java:反射小记

    Java:反射小记 对 Java 中的 反射,做一个微不足道的小小小小记 概念 Java 反射指的是在 Java 程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象, ...

  4. Java:泛型小记

    Java:泛型小记 对 Java 中的 泛型类,做一个微不足道的小小小小记 泛型实现 概述 开篇: List<String> l1 = new ArrayList<String> ...

  5. Java:创建对象小记

    Java:创建对象小记 对 Java 中的创建对象的内容,做一个微不足道的小小小小记 创建对象的方式概述 使用 new 关键字:Person person = new Person(); 反射创建:使 ...

  6. Java多线程概念简介 多线程中篇(一)

    Java的线程与操作系统的线程   在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...

  7. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  8. 一 JAVA整体概念以及安装部署

    JAVA 基本概念  JVM(JAVA virtual machine)java虚拟机,是java的能跨平台的核心,java的跨平台实现,就是在各种系统中布置JVM,然后java应用运行在JVM中,相 ...

  9. Java分层概念(转)

    Java分层概念(转) 对于分层的概念,似乎之间简单的三层,多了,就有点难以区分了,所以收藏了这个. ervice是业务层 action层即作为控制器 DAO (Data Access Object) ...

  10. Java基础概念语法

    Java基础概念语法 注释 单行注释 //行注释说明 多行注释 /* 多行注释说明 */ 文档注释 /** *@author 程序的作者 *@version 源文件的版本 *@param 方法的参数说 ...

随机推荐

  1. 痞子衡嵌入式:MCUXpresso IDE下将应用程序RW段分散链接的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下将应用程序RW段分散链接的几种方法. 早期的 MCU 芯片,一般都会嵌入内部 Flash 和 RAM,并且 ...

  2. noip模拟43

    A. 第一题 儿子遍历顺序按深度由小到大即可 B. 第二题 二分最小值,以点权作为初始距离跑最长路即可 直接用大根堆跑 \(dij\) 会 \(T\),考虑初始权值可以处理,且边权一定,用类似蚯蚓的方 ...

  3. redis跨实例迁移 & redis上云

    1)redis跨实例迁移--源实例db11迁移至目标实例db30 root@fe2e836e4470:/data# redis-cli -a pwd1 -n 11 keys \* |while rea ...

  4. docker的网络基础

    docker使用的与Linux网络有关的主要技术: Network Namespace Veth 设备对 Iptables/Netfilter 网桥 路由 <1> 网络命令空间 names ...

  5. k8s资源管理(基础操作)

    1. 基础 本文实操基于k8s 1.22.1 # 可以查看资源分配情况 kubectl describe node # 全局资源情况查看 kubectl api-resources 1.1 apply ...

  6. Linux内核中断顶半部和底半部的理解

    文章目录 中断上半部.下半部的概念 实现中断下半部的三种方法 软中断 软中断模版 tasklet tasklet函数模版 工作队列 工作队列函数模版 进程上下文和中断上下文 软中断和硬中断的区别 硬中 ...

  7. Python新手的奇技淫巧,掌握在手的充实感

    以下是我长久以来收集的一些Python实用技巧和工具,希望能对刚学习Python的新手有所帮助.  1.交换变量 x = 6 y = 5 x, y = y, x print x >>> ...

  8. CS:APP Chapter-6 存储器层次系统-读书笔记

    存储器层次系统 笔记,应该不是一个大而全的文件,笔记应该是提纲挈领,是对思想的汇总浓缩,如果追求详实的内容反而是丢了初心. 计算机是抽象的,它的设计者努力让计算机变得简单,在设计上高度抽象,而计算机的 ...

  9. (转载https://segmentfault.com/a/1190000016313947)了解RestFul Api架构风格设计

    最近几年REST API越来越流行,特别是随着微服务的概念被广泛接受和应用,很多Web Service都使用了REST API. REST是HTTP规范主要编写者之一的Roy Fielding提出的, ...

  10. axios的简单的使用

    Axios 是什么? Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中. 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中).在服务端 ...