访问修饰符作用范围由大到小是_9个java基础小知识

1da1dfa0e96e0b40253b213c9fb9c994.png

一、面向对象和面向过程的区别

1. 面向过程 : 面向过程性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考虑因素时(例如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发),但是,面向过程没有面向对象易维护、易复用、易扩展。

2.面向对象 : 面向对象易维护、易复用、易扩展。因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是面向对象的性能比面向过程低。

说明:这个并不是根本原因,面向过程也需要分配内存,计算内存偏移量,Java性能差的主要原因并不是因为它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码。而面向过程语言大多都是直接编译成机械码在电脑上执行,并且其它一些面向过程的脚本语言性能也并不一定比Java好。

二、关于JVM、JDK和JRE最详细通俗的解答

  1. JVM

java虚拟机(JVM)是运行java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows、Linux、MacOS),目的是使用相同的字节码,它们都会给出相同的结果。

2. 什么是字节码?采用字节码的好处是什么?

在java中,JVM可以理解的代码就叫做 字节码 (即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同事又保留了解释型语言的可移植性的特点。所以java程序运行时比较高效,而且由于字节码并不针对一种特定的机器,因此java程序无须重新编译便可在多种不同的操作系统下运行。

2. 1 java程序从源代码到运行的执行步骤:

1a572345d9674aa69d02a5399ab73650.png

说明: 特别注意的是.class到机器码这一步,在这一步JVM类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对较慢。而且有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了JIT编译器,而JIT属于运行时编译。当JIT编译器完成第一次编译之后,其会将字节码对应的机器码保存下来,下次可以直接使用。

2.2 JDK

JDK是Java Development Kit,它是功能齐全的Java SDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。

2.3 JRE

JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。但是,它不能用于创建新程序。

3. java和c++的区别?

3.1 都是面向对象的语言,都支持封装、继承和多态。

3.2 java不提供指针来直接访问内存,程序内存更加安全。

三、重载和重写的区别

3.1、重载: 发生在一个类中,方法名称必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

3.2、重写: 发生在父子类中,方法名、参数列表必须相同,返回值的范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。如果父类的方法访问修饰符为private,那么子类就不能重写改方法。

想要了解领取更多关于java知识点的可以点击下方链接

java资料包​pan.baidu.com

提取码:poom

四、Java 面向对象编程三大特性: 封装 继承 多态

4.1、封装:

封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

4.2、继承:

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。

继承说明:

5.2.1、 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。

5.2.2、 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

5.2.3、 子类可以用自己的方式实现父类的方法。(以后介绍)。

4.3、多态:

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

五、String、StringBuffer和StringBuilder的区别

5.1 可变性

String类中使用了final关键字修饰字符数组来保存字符串(private finalchar value[ ]),所以String对象时不可变的。而StringBuffer和StringBuilder都是继承AbstractStringBuilder类,在AbstractStringBuilder类中没有使用final关键字修饰,所以这两种对象时可变的。(他们两个的构造方法都是使用的是父类的构造方法)。

5.2 线程安全性

String中的对象时不可变的,故String对象时线程安全的。

AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

5.3 性能

StringBuilder > StringBuffer > String

相同情况下StringBuilder 仅能比StringBuffer 获得10%-15%的性能,但却要冒多线程不安全的风险。

5.4 总结

5.4.1 操作少量的数据: 适用String

5.4.2 单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder

5.4.3 多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer

六、在一个静态方法内调用一个非静态成员为什么是非法的?

因为静态方法从程序编译完成时就已经存在了,而非静态成员得先通过实例化才能存在,那么如果在一个静态方法里调用了一个非静态成员,就有可能这个非静态成员压根还没实例化出来,程序也就无法得知是个啥,所以必须是非法的。

七、接口和抽象类的区别

8.1、 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。

8.2、 接口中除了static、final变量,不能有其他变量,而抽象类中则不一定。

8.3、 一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过extends关键字扩展多个接口。

8.4、 接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)。

8.5、 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。

八、成员变量与局部变量的区别有哪些?

9.1、 从语法形式上看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。

9.2、 从变量在内存中的存储方式来看:如果成员变量是使用static修饰的,那么这个成员变量是属于类的,如果没有使用static修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。

9.3、 从变量在内存中的生存时间上看:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。

9.4、 成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。

九、== 与 equals区别(重要)

10.1、==

它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)。

10.2、equals()

它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

情况1: 类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

情况2: 类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

例子展示:

public class test1 { public static void main(String[] args) {

String a = new String("ab"); // a 为一个引用

String b = new String("ab"); // b为另一个引用,对象的内容一样

String aa = "ab"; // 放在常量池中

String bb = "ab"; // 从常量池中查找

if (aa == bb) // true System.out.println("aa==bb");

if (a == b) // false,非同一对象 System.out.println("a==b");

if (a.equals(b)) // true System.out.println("aEQb");

if (42 == 42.0) { // true System.out.println("true");

}

}

}

说明:

1、 String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。

2、 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

java资料包​pan.baidu.com

提取码:poom

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

System.out.println(i++); System.out.println(++i);的区别

之前一直对i和i很模糊,这次通过两个小demo来探究下。 例1: 1 public static void main(String[] args) { 2 int i2; 3 System.out.println(i); 4 System.out.println(i); 5 }run: 2 3 例2: 1 public static void…

python如何导入函数_Python导入(import)模块的方法

1、导入整个模块:模块 是扩展名为.py的文件,包含要导入到程序中的代码。import module_name 2、导入特定的函数from module_name import function_name 也可以导入多个from module_name import function_0, function_1, function_2 3、使用as 给函数指定…

白盒测试用例设计方法(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖、基本路径覆盖)

语句覆盖:每条语句至少执行一次。 判定覆盖:每个判定的所有可能结果至少出现一次。(又称“分支覆盖”) 条件覆盖:每个条件的所有可能结果至少执行一次。 判定/条件覆盖:一个判定中的每个条件的所有可能结果…

Python之列表和元组

01 序列 成员有序排列的,且可以通过下标偏移量访问到它的一个或者几个成员,这类类型统称为序列 序列数据类型包括:字符串,列表,和元组类型。 特点: 都支持下面的特性 索引与切片操作符 成员关系操作符(in , not in) 连接操作符() & 重复操作符(*) 0…

负数、取模与取余

总结: ‘%’ 在C/C,Java等语言中意为 取余 ,在python 中意为 取模 取余(rem)和取模(mod)在被除数、除数同号时,结果是等同的,异号时会有区别,所以要特别注意…

webgl编程指南源码_ThreeJS 源码剖析之 Renderer(一)

引子?最近,忽然想起曾在 WebGL 基础系列 文章中立下 flag:“后续还打算出 《ThreeJS 源码剖析》 系列”(特意翻出原话?),项目忙了一阵后,便决定开始写此系列,更新周期不固定,毕竟项目排期“天晓得”。此系…

python之集合与字典

01 一山不容二虎的集合 1.通俗来说,集合(set)是一个无序的不重复元素序列,就是一个用来存放数据的容器。 1)集合里面的元素是不可重复的: 如: s {1,2,3,4,1,2,3} print(s,type(s)) # 输出结…

求最大公约数——辗转相除法

最大公约数的基本原理: 两个数的最大公约数是指能同时整除它们的最大正整数。 设两数为a、b(a≥b)&#xff0c;求a和b最大公约数。 辗转相除法 代码如下&#xff1a; //只截取了一部分&#xff0c;完整代码可看下方 while (b<0){t a % b;a b;b t;}我们可以发现辗转相…

opencv roberts算子_边缘检测 Roberts算子

Roberts算子是一种最简单的算子&#xff0c;利用局部差分算子寻找边缘的算子。采用对角线相邻两像素之差近似梯度幅值检测边缘。。检测垂直边缘的效果比斜向边缘要好&#xff0c;定位精度高&#xff0c;对噪声比较敏感&#xff0c;无法抑制噪声的影响。Roberts边缘算子是一个2x…

Python习题week1

知识点1&#xff1a; 输入变为浮点数&#xff1a;score input("请输入成绩&#xff1a;") score float(score) 1题目&#xff1a;利用条件运算符的嵌套来完成此题&#xff1a;学习成绩>90分的同学用A表示&#xff0c;60-89分之间的用B表示&#xff0c;60分以下…

参数传值swap

对于下面的代码&#xff1a; #include <stdio.h> void swap(int a,int b);int main() {int a5;int b7;swap(a,b);printf("a%d,b%d",a,b);return 0; }void swap(int a,int b) {int t a;ab;bt; }输出结果却是&#xff1a; a5,b7 Process returned 0 (0x0) ex…

python在材料方面的应用_python记录材料题带标准答案

1.Python 是如何进行内存管理的&#xff1f; 答 : 从三个方面来说 , 一对象的引用计数机制 , 二垃圾回收机制 , 三内存池机制 一、对象的引用计数机制 Python 内部使用引用计数&#xff0c; 来保持追踪内存中的对象&#xff0c; 所有对象都有引用计数。 引用计数增加的情况&…

Python习题week2

知识点总结&#xff1a; 1.去除数字前面的零 Num int(input("请输入正整数&#xff1a;")) 2. 矩阵方式输入处理 # 输入方法3 按矩阵形式输入 list_juzhen [] for i in range(3):input_str input()input_list input_str.split(" ")list_juzhen.app…

74ls90设计十进制计数器电路图_PLC控制系统的设计与调试步骤你知多少?

作为电气工程技术人员我们在平时工作中常常要对PLC控制系统进行设计与调试&#xff0c;下面给各位朋友分享一下PLC控制系统的设计与调试步骤。PLC控制系统的设计与调试过程是这样的&#xff1b;第一点需要我们深入了解被控制系统。我们在设计前应该熟悉图样资料&#xff0c;并深…

python习题week3

1、从输入的字典中获取给定key的值&#xff0c; 实现函数&#xff1a;get_key_value(source_dict, key, index0)&#xff0c;source_dict指给定的字典&#xff0c;key指需要获取的key字段&#xff0c;index指的是需要获取相同key的第几个值&#xff0c;从0开始&#xff0c;默认…

python硬件_「大神器!」硬件的AI性能测试Python库发布

目前人工智能技术发展速度很快&#xff0c;也很吸引眼球。但是对于各种多如牛毛的方法&#xff0c;目前并米有一个可靠的精准的基准来衡量各项硬件在不同算法训练和推理的性能。现在&#xff0c;不用愁了。国外的一个哥们&#xff0c; Andrey Ignatov发布了一个python库。大家可…

Python random模块seed理解

想要在同一个程序中产生同一组随机数,需要在下一个函数设置一个相同的随机种子 random.seed(0)&#xff0c;其中的0是对应的随机数的种子&#xff0c;如果不设置这个值&#xff0c;则系统根据时间来自己选择这个值&#xff0c;此时每次生成的随机数因时间差异而不同 import …

python生成1到100的列表_python列表生成式与列表生成器的使用

列表生成式&#xff1a;会将所有的结果全部计算出来&#xff0c;把结果存放到内存中&#xff0c;如果列表中数据比较多&#xff0c;就会占用过多的内存空间&#xff0c;可能会导致MemoryError内存错误或者导致程序在运行时出现卡顿的情况 列表生成器&#xff1a;会创建一个列表…

python之异常处理

关于错误和异常 &#xff08;1&#xff09;概念&#xff1a;错误是无法通过其他代码进行处理问题&#xff0c;如语法错误和逻辑错误&#xff0c;语法错误是单词或格式等写错&#xff0c;只能根据系统提示去修改相应的代码&#xff0c;逻辑错误是代码实现功能的逻辑有问题&…

python图像质量评价_OpenCV图像质量评价的SSIM算法(图像相似度)

添加函数体。将SSIM函数添加至命名空间后。该函数主要功能是时哟功能ssim算法对两张图像进行比较&#xff0c;并将图像在各通道比较的结果以scalar形式返回。 Scalar getMSSIM(char * imagePatha,char * imagePathb) { Mat i1imread(imagePatha); Mat i2imread(imagePathb); co…