JAVA基础知识全面总结【新生必看一起学习】

java 基础知识全面总结

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 2

2.“static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? 3

3.是否可以在static环境中访问非static变量?

4.Java支持的数据类型有哪些?什么是自动拆装箱?

5.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

6.Java支持多继承么?

7.基础: final修饰基本数据类型变量和引用数据类型变量.

进阶: 被final修饰的常量在编译阶段会被放入常量池中

探索: 为什么局部/匿名内部类在使用外部局部变量时, 只能使用被final修饰的变量?

8.什么是值传递和引用传递?

9.创建线程有几种不同的方式?你喜欢哪一种?为什么?

10.同步方法和同步代码块的区别是什么?

11.什么是死锁(deadlock)?

探究final在java中的作用

①被final修饰的变量是不能够被改变的. 但是这里的"不能够被改变"对于不同的数据类型是有不同的含义的.当final修饰的是一个基本数据类型数据时, 这个数据的值在初始化后将不能被改变; 当final修饰的是一个引用类型数据时, 也就是修饰一个对象时, 引用在初始化后将永远指向一个内存地址, 不可修改. 但是该内存地址中保存的对象信息, 是可以进行修改的.

②进阶: 被final修饰的常量在编译阶段会被放入常量池中final是用于定义常量的, 定义常量的好处是: 不需要重复地创建相同的变量. 而常量池是Java的一项重要技术, 由final修饰的变量会在编译阶段放入到调用类的常量池中.

③探索: 为什么局部/匿名内部类在使用外部局部变量时, 只能使用被final修饰的变量提示: 在JDK1.8以后, 通过内部类访问外部局部变量时, 无需显式把外部局部变量声明为final. 不是说不需要声明为final了, 而是这件事情在编译期间系统帮我们做了. 但是我们还是有必要了解为什么要用final修饰外部局部变量. 所以当在内部类中使用外部局部变量的时候应该用final修饰局部变量, 这样局部变量a的值就永远不会改变, 也避免了数据不一致问题的发生

④ final修饰方法 使用final修饰方法有两个作用, 首要作用是锁定方法, 不让任何继承类对其进行修改.另外一个作用是在编译器对方法进行内联, 提升效率. 但是现在已经很少这么使用了, 近代的Java版本已经把这部分的优化处理得很好了.

⑤final修饰类,使用final修饰类的目的简单明确: 表明这个类不能被继承.,当程序中有永远不会被继承的类时, 可以使用final关键字修饰,被final修饰的类所有成员方法都将被隐式修饰为final方法.

深入分析Java中的关键字static

①static关键字基本概念,方便在没有创建对象的情况下来进行调用。

也就是说:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。

②static关键字修饰类,但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。

③static关键字修饰方法,修饰方法的时候,其实跟类一样,可以直接通过类名来进行调用

④static关键字修饰变量,被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。

⑤static关键字修饰代码块

静态代码块在类第一次被载入时执行,在这里主要是想验证一下,类初始化的顺序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mdc2vJoe-1592787631486)(https://pics3.baidu.com/feed/8644ebf81a4c510f633a3493cb792028d52aa567.jpeg?token=b0b04912bdd617c95caaf53cd29fe393&s=E4906C32198A444D5C64ACDA0000C0B3)]

下面对static关键字进行一个小结:

(1)特点:

1、static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量。

2、static修饰的成员被所有的对象共享。

3、static优先于对象存在,因为static的成员随着类的加载就已经存在。

4、static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。

5、static修饰的数据是共享数据,对象中的存储的是特有的数据。

(2)成员变量和静态变量的区别:

1、生命周期的不同:

成员变量随着对象的创建而存在随着对象的回收而释放。

静态变量随着类的加载而存在随着类的消失而消失。

2、调用方式不同:

成员变量只能被对象调用。

静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

3、别名不同:

成员变量也称为实例变量。

静态变量称为类变量。

4、数据存储位置不同:

成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。

静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

(3)静态使用时需要注意的事项:

1、静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)

2、静态方法中不可以使用this或者super关键字。

3、主函数是静态的

java的内存结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aPtMCH2D-1592787631489)(https://pics3.baidu.com/feed/024f78f0f736afc33409f1471839eec1b74512b4.jpeg?token=33db0ecbe211c671b69179720b8e41d4&s=ED9CAA528ACE3EC846392E6303003066)]

从上图我们可以发现,静态变量存放在方法区中,并且是被所有线程所共享的。这里要说一下java堆,java堆存放的就是我们创建的一个个实例变量。

堆区:

1、存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

2、jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区:

1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

2、每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

3、栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。、

方法区:

1、又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

2、方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pi1BBWML-1592787631491)(https://pics2.baidu.com/feed/f3d3572c11dfa9ec028d9199c8f0f206908fc147.jpeg?token=2a78319a30f2dfd3eebeaea669541f68&s=2FA67D228BEF410B12F085D3000090B3)]

什么是死锁(deadlock)

死锁 :是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去
(1) 因为系统资源不足。
(2) 进程运行推进顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
的情况下占用资源。因此,对资源的分配要给予合理的规划。

猜你喜欢

转载自blog.csdn.net/weixin_42462804/article/details/106895302