java基础知识总结(一)
1.Java介绍
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程
什么是静态面向对象语言?
一个程序的运行过程主要分为三个步骤:编译->链接->执行;
静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
什么是动态面向对象语言?
动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
什么是编译型语言?
编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。例如:C/C++ 等都是编译型语言。
什么是解释型语言?
解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。Java,C#等都是解释型语言。
- 虽然Java程序在运行之前也有一个编译过程,但是并不是将程序编译成机器语言,而是将它编译成字节码,在运行的时候,由JVM将字节码再翻译成机器语言。
- 脚本语言是一种解释性的语言,脚本语言一般都有相应的脚本引擎来解释执行。 他们一般需要解释器才能运行。JAVASCRIPT,ASP,PHP,PERL,Nuva都是脚本语言。
1.1 特性
- 简单性
相比c++,去除了较为复杂的多继承,指针的概念以及一些很少使用的功能。
- 面向对象
每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。
- 分布性
支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。
- 编译和解释性
Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台
- 稳健性
Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java要求显式的方法声明
- 安全性
Java的存储分配模型是它防御恶意代码的主要方法之一
- 可移植性
Java使得语言声明不依赖于实现的方面。例如,Java显式说明每个基本数据类型的大小和它的运算行为
- 高性能
Java是一种先编译后解释的语言,所以它不如全编译性语言快,在运行时把Java字节码翻译成特定CPU(中央处理器)的机器代码,也就是实现全编译了。
- 多线程性
Java是多线程语言,它提供支持多线程的执行(也称为轻便过程),能处理不同任务,使具有线索的程序设计很容易。Java的lang包提供一个Thread类
10.动态性
Java语言设计成适应于变化的环境,它是一个动态的语言.例如,Java中的类是根据需要载入的,甚至有些是通过网络获取
1.2 JDK、JRE、JVM三者间的关系

- JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类
开发环境
- Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库
运行环境
- JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。
1.3 Java程序开发与运行机制
- 编写源程序,java源代码文件
- 编译源程序,编译器编译编译成.java字节码文件。
- 运行时,Java虚拟机(JVM)将.Java源文件编译成可运行的.class文件。
- 最后由class转成机器语言,实现全编译
1.4 JAVA的内存机制
- java是如何管理内存的
java的内存管理就是对象的分配和释放问题。
分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。
释放:对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作。但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监> 控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。
- java的内存泄露
内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连(也就是说仍存在该内存对象的引用);其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
- JVM的内存区域组成

Java虚拟机所管理的内存区域分为如下部分:方法区、堆内存、虚拟机栈、本地方法栈、程序计数器。
堆和栈
- 在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;
- 堆内存用来存放由new创建的对象和数组以及对象的实例变量
- 在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理
堆和栈的优缺点
- 堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;
- 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。另外,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
2.基础语法
2.1 Java基本数据类型
基本数据类型:byte、short、int、long、float、double、char、boolean
| 数据类型 | boolean | byte | char | short | int | long | float | double |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 字节数 | 1 | 1 | 2 | 2 | 8 | 4 | 8 |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 封装类 | Boolean | Byte | Character | Short | Integer | Long | Float | Double |
包装类和基本类型的区别?
- 包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址;基本类型不是
- 包装类型是引用的传递;基本类型是值的传递
- 基本数据类型不需要new关键字
- 基本数据类型直接将值保存在值栈中,包装类型是把对象放在堆中,然后通过对象的引用来调用他们
- int的初始值为 0 、 boolean的初始值为false , 包装类型的初始值为null
2.1 常见关键字
- public (公有的):可跨包
- protected (受保护的):当前包内可用
- private (私有的):当前类可用
- class (类):public class A(){}花括号里是已实现的方法体,类名需要与文件名相同
- interface (接口):public interface B(){}花括号里有方法体,但没有实现,方法体句子后面是英文分号;结尾
- abstract (声明抽象):public abstract class C(){}介于类与接口中间,可以有,也可以没有已经实现的方法体
- implemenst (实现):用于类或接口,实现接口public class A interface B(){}
- extends (继承):用于类继承类public class A extends D(){}
- final:修饰类、方法和变量(包括成员变量和局部变量),不可修改
- static,修饰类和变量,一个static字段对每个类来说都只有一份存储空间
- this
12 super
1.java默认访问权限?
default,相比private,可以在同一个包下访问,相比protectd,不能被不同包的子类访问
2. interface 和 abstract 的区别?
- abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可bai以实现多个interface。
- 在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
- abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
- 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
- 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
- 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
- 接口中的方法默认都是 public,abstract 类型的。
3. implemenst 和extends的区别?
- implemenst 可以多实现,extends只能继承一个,可以覆盖父类的方法,需要实现,不可以修改,用implements,只定义接口需要具体实现;可以被修改扩展性好,用extends。
4. static
- 先静态对象,后非静态对象,且静态初始化只在Class对象首次加载时进行一次。
- 在静态方法区内的东西只有一份,所有的对象共享这一份空间,只要有一个对象对属性进行修改,所有的对象调用都是修改后的数据。
- 代码块的执行顺序:静态代码块(只被调用一次)>构造代码块{}>构造方法>普通方法(需调用)
5. super和this的区别
- this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
- super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。
2.2 重写(Overriding)与重载(Overloading)
方法重载: 指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
即同名方法,不同参数,不同返回参数
必须具有不同的参数列表;
可以有不同的返回类型,只要参数列表不同就可以了;
可以有不同的访问修饰符;
可以抛出不同的异常;
方法重写: 存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
参数列表必须完全与被重写的方法相同
返回的类型必须一直与被重写的方法的返回类型相同
访问修饰符的限制一定要大于被重写方法的访问修饰符
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
ps:
(1)子类中不能重写父类中的final方法
(2)子类中必须重写父类中的abstract方法
(3)子类函数的访问修饰权限不能小于父类的;
(4)子类的异常类型要小于父类;
**作用: ** 重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值

浙公网安备 33010602011771号