欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java基础笔记,java笔记

来源: javaer 分享于  点击 39609 次 点评:169

java基础笔记,java笔记


java SE java的基础开发平台
java ee java企业级开发平台
java ME 移动端开发平台(但是不常用)

Java面向对象的三大特征(封装、继承、多态)

java的三大特点:

java的运行机制:

classpath 一般配置为. 意味着在当前目录下,当前解释器解释运行.class文件时寻找.class文件的目录
在jdk1.5之后,当我们不配置classpath的时候,我们的jdk会默认.class文件就在当前目录下

class关键字:代表声明一个类

jdk:java开发工具包,包含编译器+jre+工具(可执行文件)+类库

jre:java运行时环境,包含解释器和jvm。提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)和丰富的系统类库。系统类库即为java提前封装好的功能类,只需拿来直接使用即可,可以大大的提高开发效率。

JVM:给java跨平台的特性提供支持,提供了字节码文件(.class)的运行环境支持。最大的好处就是屏蔽平台之间的底层差异,因为它知道底层硬件平台的指令长度和其他特性。
JDK包含JRE包含JVM。

  1. Java支持的数据类型有哪些及其对应的字节数?什么是自动拆装箱?
    布尔型 boolean 1
    整数值型byte,short,int,long 1,2,4,8
    字符型 char 2
    浮点型 float,double 4,8
    默认的整数类型是int型吗,小数类型是double型,float和long类型用到的时候需要在后面加上f和l后缀
    首先知道String是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。引用类型包括类、接口、数组等。String类还是final修饰的。

自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这
个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆
箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱.

  1. 面向对象是什么,及面向对象的4个特征?
    面向对象是一种思想,世间万物都可以看做一个对象,这里只讨论面向对象编程(OOP),Java是一个支持并发、基于类和面向对象的计算机编程语言,面向对象软件开发的优点:
    代码开发模块化,更易维护和修改;
    代码复用性强;
    增强代码的可靠性和灵活性;
    增加代码的可读性。

特征:抽象,封装,继承,多态
5. &和&&,|和||的区别?
&和|为按位与预算 &&和||为逻辑与运算
&时,左边无论真假,右边都进行运算;
&&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
|时,左边无论真假,右边都进行运算;
||时,左边为真,右边不参与运算。
6. 什么是值传递和引用传递?
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
一般认为,java内的传递都是值传递. java中实例对象的传递是引用传递 。
7. 简述方法覆盖和方法重载?
方法覆盖(重写)和方法重载具有以下相同点:
·都要求方法同名。
·都可以用于抽象方法和非抽象方法之间。
方法覆盖和方法重载具有以下不同点:
·方法覆盖要求参数签名必须一致,而方法重载要求参数签名必须不一致。
· 方法覆盖要求返回类型必须一致,而方法重载对此不做限制。
·方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。
·方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
·父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次
8. 简述接口和抽象类的区别?
(1) 一个类可以实现多个接口,但是却只能继承最多一个抽象类;
(2) 抽象类可以包含具体的方法,接口的所有方法都是抽象的;
(3) 抽象类可以声明和使用字段;接口则不能,但接口可以创静态的final常量;
(4) 接口的方法都是public的,抽象类的方法可以使public,private,protected或者是默认的default;
(5) 抽象类可以定义构造函数,但是接口不行。
(6) 如果许多类实现了某个接口,那么每个都要用代码实现那些方法
(7) 抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。
9. 简述成员变量和局部变量的区别?
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

  1. 分别写出system.out.println(2.0-1.1)和system.out.println(2.0F-1.1F)的结果。并且说明为什么?
    0.8999999999999999 和 0.9
    1.在Java中,未声明类型的小数会被默认当做double型处理。
    2.将double型数据转换为float型数据时,会有一定程度上的精度丢失,因此用float做2.0-1.1的时候,反而得到了“准确”的答案。
    拓展:
    用C语言也做了一下这个测试:
    printf("%f",2.0-1.1);
    1.C语言中处理未声明的小数,跟Java同样是默认按照double型来处理的。
    2.C语言中对小数的存储遵循的跟Java是同一套标准。
    3.根据“默认参数提升”原则,在printf()中,%f代表的是double型数据,就算后面的值是float也会被提升为double型。
    既然是这样,那么为什么会输出0.900000呢?
    因为在printf()中,%f占位符在未设置小数位长度的状态下,默认输出6位,而6位显然是没法把一个double型数据“完整”输出的,因此计算机做了一定程度上的取舍,然后输出了0.9。
    printf("%.30f",2.0-1.1);
  2. Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
    1)当新对象被创建的时候,构造方法就会被调用。每一个类都有构造方法,如果程序员没有给
    类提 供构造方法,Java编译器会为这个类创建一个默认的无参数的构造方法。
    2)构造方法重载跟方法重载很相似,可以为一个类创建多个构造方法,每一个构造方法必须有
    它自己唯一的参数列表
    3)Java不支持构造方法的复制,复制构造方法是C++的内容
  3. 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
    (1) Stack;存储普通数据类型和对应的封装数据类型对象,方法的参数和局部变量,对象的引用,
    (2) Heap:存储对象
    (3) Method area:静态区
    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在常量池中,常量池是方法区的一部分,。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整,栈空间用光了会引发StackOverflowError,而堆和常量池空间不足则会引发OutOfMemoryError。

14.用最有效率的方法计算2乘以8?
2<<3
15.String和StringBuilder、StringBuffer的区别?
String:不可变
StringBuilder与StringBuffer:可变,StringBuilder,线程不安全,效率高;StringBuffer线程安全,效率低
16. 进程和线程之前的区别?
进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径。
17. 多线程的创建方式,哪一种方法比较好?
(1) 继承Thread或Runable接口
(2) 继承Runable接口好,因为java类是单继承接口是多继承
18. 同步代码块和同步函数的区别?
(1) 同步代码块可以锁任意自定义对象,同步函数锁对象只能是this
(2)如果多个线程使用同一个锁的话,那么两者均可以使用,如果存在多个锁的话,只能使用同步代码块

  1. 同步函数与静态同步函数的区别(或者说是现在一个静态方法和一个非静态方法怎么实现同步)?
    (1) 静态同步函数的锁对象是.class,同步函数锁对象是this
  2. wait()、notify()、sleep()区别?
    Wait()让当前线程所有的运行状态变成等待状态,和同步一起使用。
    Notify()是唤醒现在正在等待的状态,和同步一起使用。
    ① sleep()是Thread内的方法。Wait()是Object类中的。
    ② sleep()方法导致了程序暂停执行指定的时间,让出cpu 给其他线程,但是他的监控状态依然保持,当指定的时间到了又会自动恢复运行状态。
    调用sleep 方法过程中不会释放锁对象。
    但是调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。获取对象池锁进入运行状态。
  3. switch中能否使用string做参数
    jdk1.7之后可以
    (1) 可以,枚举也可以做switch的参数
  4. a=a+b 与a+=b用什么区别吗?
    +=操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换。如:
    byte a = 127;
    byte b = 127;
    b = a + b; // error : cannot convert from int to byte
    b += a; // ok
    (注:这个地方应该表述的有误,其实无论 a+b 的值为多少,编译器都会报错,因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)
  5. 一个char类型的变量占2个字节,一个short类型的变量也占2个字节,为什么char变量的数据赋值给short类型的变量时,需要强制类型转换。
    在java中,char和short都是两个字节的长度。但char表示的是16位无符号整数,表示的范围为0~65535。short表示的是16位有符号整数,范围为-32768~32767。char用来保存一个Unicode编码的字符。char和short之间类型转换需要强转
  6. 深拷贝与浅拷贝的区别是什么?
    浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
    深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

深拷贝和浅拷贝的区别:是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。

25.父类的静态方法能否被子类重写
不能。父类的静态方法不能被子类继承,更谈不上重写,就算是子类中有一个和父类一模一样的静态方法,那也是子类本身的,和父类的那个静态方法不是一回事。方法加静态后就属于类不属于对象了

相关文章

    暂无相关文章
相关栏目:

用户点评