Java教程

Java基础

本文主要是介绍Java基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

JVM JDK JRE

  1. jvm是运行java字节码的虚拟机,jvm在不同的操作系统上使用相同的字节码,产生相同的效果(字节码就是java代码编译后生成的.class文件)
  2. jdk 即java sdk,负责创建和编译程序,有jre拥有的一切,还有编译器以及javadoc等工具
  3. jre是java运行时的环境,包含JVM,java类库和一些基础构件。

JAVA 和 C++区别

相同点: 都是面向对象编程,都支持封装继承多态
不同点: java不提供指针直接访问内存,程序更安全,java是单继承,c++是多继承;但是java的接口可以多继承。

为什么说Java是 编译与解释并存的语言

因为JAVA程序的运行要经历两个阶段,先编译后解释。先经过JVM虚拟机编译生成.class文件,再经过JAVA解释器来解释执行,所以认为是这种语言

字符型常量和字符串常量的区别

形式上:单引号单字符,和双引号多字符
内涵上:char常量表示ASCII的值,可以参见表达式的运算;而string常量表示的是内存地址
大小上:char占两个字节,string占多个字节

continue break return

continue打破当次循环,继续下一次循环
break打破当前最近的循环,跳出循环体
return打断方法的执行

泛型与类型擦除 和常用通配符

泛型表示将数据类型指定为一个参数
JAVA泛型都是伪泛型,在编译期间,泛型信息被擦除。这指的就是类型擦除
T 一个java类
E 元素
KV key value 键值对

==和equals的区别

==:基础数据类型比较内容,引用数据类型比较内存地址。
equals:比较的是两个对象是否相等,存在于Object类中,通常通过重写equals方法来对比对象的内容是否相等。若不重写,则认为与也是比较的内存地址
(String的equals方法在Java底层是被重写过的,比较的是对象的值)
(在创建String对象时,虚拟机会在常量池找是否又符合的值,有则将值的引用赋给String对象,无则重新创建String对象)

Hashcode() 与 euqals()

HashCode()方法根据哈希表的位置,返回一个int整数,确定对象在哈希表的位置
为什么要有hashcode呢?
为了极大减小equals()方法的调用次数,提高运行效率。因为在将对象存入时,会先比较hashcode的值,如果相同则认为对象没有重复出现,若相同,则再调用equal方法判断对象是否真的相等。
为什么重写equal时要重写hashcode?
两个对象hashcode相同,但是两个对象不一定相等,所以重写equal了就要重写hashcode(hashcode用于缩小查找成本,equal判断是否真的相等)

自动装箱和自动拆箱

Integer i=40 编译阶段自动装箱为Integer类
i=Integer.valueof(40) 从常量池中赋值给i
Integer i= new Integer(40) 创建新的对象
注意:+ - * / 运算符 包装类型无法识别,遇到时会自动拆箱成对应的基本数据类型

为什么Java中只有值的传递

语言就这样设计的
方法得到的所有参数都只是一个拷贝,不能修改传递给他的那个参数。
1.方法的结果不能改变基本数据类型的参数
2.方法的结果可以改变对象的参数
3.方法的结果不可以让对象引用新的对象

重载与重写

重载:发生在同一个类中,编译阶段,方法名必须相同,返回值类型可以不同,修饰参数可以不同,并且参数的类型或数量和顺序可以不同,用于简化开发
重写:发生在运行阶段,用在子类继承父类的相同的方法,用于覆盖父类的方法,修饰符类型比父类大,异常范围小于父类,并且方法名,参数,返回值必须和父类相同。并且private final static 和构造方法无法被重写

浅拷贝和深拷贝

浅拷贝:对基本数据类型进行值的传递,对引用数据类型进行引用的传递拷贝
深拷贝:对基本数据类型进行值的传递,对引用数据类型创建新的对象,并复制其内容

类和面向对象

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

面向过程:性能优于面向对象,如单片机,嵌入式开发,但是没有面向对象易维护,易复用,易扩展
面向对象:易维护,易复用,易扩展。因为有封装继承多态的特性,但是性能比面向过程低

2.构造器可以override么

不可以,构造器不能被重写,但可以被重载

3.定义无参数构造器的意义

如果子类在调用父类的构造方法时,没有加super()去调用父类的特殊构造器的方法,那么默认调用父类的无参构造器,此时父类若没有无参构造器,则会出现编译错误。

4.成员变量和局部变量的区别

1.成员变量定义在类中,方法外。所有方法都可调用 局部变量定义在方法体中,只能供方法调用
2.成员变量可以被子类继承,局部变量不能被子类继承
3.成员变量能被 public private static修饰,局部变量不能被static修饰
4.若成员变量不被static修饰,那么它属于实例对象的,存放在堆内存。而局部变量就存在栈内存区。
5.成员变量随着对象的创建而存在,局部变量随着方法调用的结束而消失
6.成员变量不赋值会被赋予默认值,而局部变量不会自动赋值。

5.对象实体与对象引用的区别

对象实体就是指对象本身,存放在堆中
对象引用存放的是对象实体的内存地址,指向对象实体。引用被存在栈内存中

6.构造方法有什么用,没有构造法能正常执行么

构造方法用于对象的初始化。
是可以正常执行的,因为如果写任何的构造方法,创建对象时会自己创建一个无参的构造方法用于初始化。
但是写了有参的构造方法,那么也需要将无参的构造方法写出来。防止子类没有加super()去调用父类的特殊构造器的方法,那么默认调用父类的无参构造器,此时父类若没有无参构造器,则会出现编译错误。

7.构造器的特性

1.无返回值,并不能被void修饰
2.方法名与类名相同
3.无需调用,自动执行

8.子类构造方法前都会先调用父类的构造法是因为

因为子类需要继承父类的数据,所以需要知道父类是怎么初始化数据的,所以可以帮助子类进行初始化

9.面向过程三大特性-封装,继承,多态

封装:把一个对象的信息隐藏在对象的内部,不允许外界访问所有的信息,但是也需要提供一些被外界访问的方法和属性。不想被访问的数据就不显示,但是如果都不允许访问,那么就没有意义了。(空调与遥控器)

继承:将属性相似的类抽象成一个父类(Animal与cat),继承可以快速地创建对象,提高代码的重用,提高开发效率(1.子类拥有父类所有的属性和方法,但是被private修饰的属性和方法,无法访问。2.子类有自己的方法,即对父类方法的扩展。3.子类可以实现父类的方法 )

多态:一个对象具有多种状态,父类的引用指向子类的对象
(Animal miaomiao = new Cat();)
特点:1.必须有继承/接口的关系
2.引用类型调用的方法具体是哪个类中的方法只有在代码运行阶段才能知道
3.如果子类重写了方法,那么执行的是子类的方法,如果没有重写,那么执行的是父类的方法

10. static final super this

final:对基本数据类型不可修改,对引用数据类型不能再指向别的对象,对类修饰时不可被继承,对方法修饰时把方法锁定,防止继承类修改它。
static:1.修饰成员变量,成员方法,表示静态,类的属性。
2.静态代码块(执行顺序为 静态代码块,非静态代码块 构造方法)
3.修饰类的时候只能修饰静态内部类
4.静态导包,不需要加类名. 也能直接调用方法
this:可写可不写,在同一个类中不同方法调用实例对象,实例方法时用到。this() 调用同类构造方法也要放在第一行
构造方法中this.变量名 访问的是成员变量,非局部变量。
super: 用于访问父类的变量和方法,super() 位于构造方法第一行,用于调用父类的构造方法

11.接口和抽象类的区别

1.接口中只能有static final变量,而抽象类不一定
2.接口的方法默认为 public 而抽象类可以为 public protected default(不要用static,因为抽象类的方法就是为了被重写)
3.接口不能有方法实现,抽象类可以有非抽象的方法
4.一个类只能有一个抽象类,但可以有多个接口
5.抽象类是一种设计模板,而接口是行为的规范

12.StringBuffer 和StringBulider的区别?String为什么不可变?

1.String类中使用final修饰的字符数组保存字符串,所以不可改变
2.StringBuffer和StringBulider继承了同一个父类,但是StringBuffer对方法加了同步锁或对变量加了同步锁,所以线程安全;StringBulider没加,所以非线程安全
(注意:每次对String类型的值进行修改,都会生成新的String对象。而StringBuffer和StringBulider是对对象本身修改。StringBulider的性能要比StringBuffer高)

12.Java序列化中有些字段不想被序列化怎么办?

用transient关键字修饰的变量可以阻止实例中变量的序列化。而且反序列化时不会被恢复和持久化。

这篇关于Java基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!