【Java】基础知识

一、特点

(我觉得必须说的)

1、面向对象(封装,继承,多态)

2、支持多线程(进程中的最小执行单位就是线程,多线程就是线程并行)

3、高效

4、平台无关性( Java 虚拟机JVM实现了一次编译,到处运行;编译后的可以在任意平台上运行)

(全部)

  • 简单易学(语法简单,上手容易);
  • 面向对象(封装,继承,多态);
  • 平台无关性( Java 虚拟机实现平台无关性);
  • 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
  • 可靠性(具备异常处理和自动内存管理机制);
  • 安全性(Java 语言本身的设计就提供了多重安全防护机制如访问权限修饰符、限制程序直接访问操作系统资源);
  • 高效性(通过 Just In Time 编译器等技术的优化,Java 语言的运行效率还是非常不错的);
  • 支持网络编程并且很方便;
  • 编译与解释并存;

二、 JVM JDK JRE

1、JVM是java的虚拟机,有针对不同的系统的特定实现。

目的:使用相同的字节码,会给出相同的结果。实现了Java 语言“一次编译,随处可以运行”

2、JDK 

功能齐全的JAVA开发工具包,用于创建及编译JAVA程序。包含了JRE以及编译器javac等工具。

3、JRE

是运行已编译 Java 程序所需的环境

三、 Java 语言“编译与解释并存”

Java既具有编译型语言的特征,也具有解释型语言的特征。

Java是先编译,生成字节码(.class文件),再由Java解释器来解释执行。

四、和Cpp的区别

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

但是:

  • Java 不提供指针,直接访问内存,程序内存更加安全
  • Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承
  • Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
  • C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载(操作符重载增加了复杂性,这与 Java 最初的设计思想不符)

五、基本语法

1、注释有几种形式

  1. 单行注释:通常用于解释方法内某单行代码的作用。

  2. 多行注释:通常用于解释一段代码的作用。

  3. 文档注释:通常用于生成 Java 开发文档。

2、标识符和关键字的区别

标识符就是名字

关键字是被赋予了特殊意义的标识符,其他的就不能取关键字了

例如警察局已经被赋予了特殊意义,再开店就不能再叫警察局了

3、基本数据类型

4、重载和重写

重载:发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。

重写:发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。

  • 方法名、参数列表必须相同,子类方法返回值类型比父类方法返回值类型更小或相等,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
  • 如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是被 static 修饰的方法能够被再次声明。
  • 构造方法无法被重写,构造方法不能被重写(override),但可以被重载(overload)。因此,一个类中可以有多个构造方法,这些构造方法可以具有不同的参数列表,以提供不同的对象初始化方式

六、面向对象

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

  • 面向过程编程(POP):面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
  • 面向对象编程(OOP):面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。

2、面向对象三大特征

(1)封装

        把一个对象的属性隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性(get,set)。

(2)继承

        不同类型的对象,相互之间经常有一定数量的共同点。提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。

父类的构造方法:不管私不私有,都不能继承(意思就是不能通过父类的构造方法来set数据或者干啥的,因为你用构造方法的方法名字要跟自己的名字一样,但父类和子类肯定不一样),但可以通过super调用

父类的成员变量:不管是什么样的修饰符,子类都可以继承。

父类的成员方法:添加到虚方法表中的可以继承(非private、static、final),没添加到虚方法表的不能继承。

(3)多态 看另一篇

表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。

  • 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
  • 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
  • 多态不能调用“只在子类存在但在父类不存在”的方法;
  • 如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法

3、深拷贝和浅拷贝区别了解吗?什么是引用拷贝?

  • 浅拷贝:(对应一个地址)浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
  • 深拷贝:(对应两个地址)深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
  • 引用拷贝:两个不同的引用指向同一个对象。

七、Object

是所有类的父类,

== 和 equals() 的区别

== 对于基本类型和引用类型的作用效果是不同的:

  • 对于基本数据类型来说,== 比较的是值。
  • 对于引用数据类型来说,== 比较的是对象的内存地址。

因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。

equals() 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。


八、String 、StringBuffer、StringBuider

1、可变性:

String不可变,其他两个可变

2、线程安全性:
String中的对象是不可变的(是用final修饰的),可以认为是常量,线程安全。

StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

3、性能:
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。


对于三者使用的总结:

  • 操作少量的数据: 适用 String
  • 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值