java的一些小知识点

1.    Abstract与哪些类不能共存,为什么(private, final,static)

  Abstract为抽象类,如果方法前面有abstract修饰,则为抽象方法,抽象方法是需要被继承才有意义的,而被final修饰的方法为最终方法,不可被继承,因此abstract与final矛盾;

2.    Static 的特点

1、随着类的加载而加载

也就是说:静态会随着类的消失而消失,说明他的生命周期最长

2、优先于对象存在

3、被所有对象所共享

4、可以直接被类名调用

 

→静态使用注意事项

1、静态方法只能访问静态成员

2、静态方法中不可以定义this,super关键字

因为静态优先于对象存在,所以静态方法中不可以出现this

3、主函数是静态的

 

3.    类与类,类与接口,接口与接口的关系

类与接口之间关系: 实现关系。

类与接口要注意的事项:

    1. 非抽象类实现一个接口时,必须要把接口中所有方法全部实现。

    2. 抽象类实现一个接口时,可以实现也可以不实现接口中的 方法。

    3. 一个类可以实现多个接口 。

接口与接口之间关系: 继承关系。

接口与接口之间要注意事项:

     一个接口是可以继承多个接口的

4.    Final,finally,fianlize的区别

 Final用于修饰类、成员变量和成员方法。final修饰的类,不能被继承(String、StringBuilder、StringBuffer、Math,不可变类),其中所有的方法都不能被重写,所以不能同时用abstract和final修饰类(abstract修饰的类是抽象类,抽象类是用于被子类继承的,和final起相反的作用);Final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法;Final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的。

5.    什么是多态,多态的好处与弊端

  多态:同一个对象(事物),在不同时刻体现出来的不同状态。

举例:

    猫是猫,猫是动物。

    水(液体,固体,气态)。

 

多态的前提:

    A:要有继承关系。

    B:要有方法重写。

        其实没有也是可以的,但是如果没有这个就没有意义。

            动物 d = new 猫();

            d.show();

            动物 d = new 狗();

            d.show();

C:要有父类引用指向子类对象。

多态的好处

    A:提高了代码的维护性(继承保证)

    B:提高了代码的扩展性(由多态保证)

       

6.    Wait()与Sleep()的区别

 对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

获取对象锁进入运行状态

 

7.    对匿名内部类的理解

  匿名内部类的创建格式为:

new 父类构造器(参数列表)| 实现接口()

{  

     //匿名内部类的类体实现

}

  使用匿名内部类时,必须继承一个类或者实现一个接口

  匿名内部类由于没有名字,因此不能定义构造函数

  匿名内部类中不能含有静态成员和静态方法

 

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

 成员变量:

          1、成员变量定义在类中,在整个类中都可以被访问。

          2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。

          3、成员变量有默认初始化值。

  局部变量:

     1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。

          2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。

          3、局部变量没有默认初始化值

      在使用变量时需要遵循的原则为:就近原则

  首先在局部范围找,有就使用;接着在成员位置找。

成员变量和静态变量的区别:

 

   1、成员变量所属于对象。所以也称为实例变量。

      静态变量所属于类。所以也称为类变量。

   2、成员变量存在于堆内存中。

      静态变量存在于方法区中。

   3、成员变量随着对象创建而存在。随着对象被回收而消失。

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

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

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

          所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据

11.  同步函数与同步代码块的区别

同步函数使用的锁是this;

同步函数和同步代码块的区别:

同步函数的锁是固定的this.

同步代码块的锁是任意的对象。

建议使用同步代码块。

因为同步函数的锁唯一的,只能是this

当同步代码块的锁是this时,可以简写成同步函数

12.  数组与集合的区别

一、数组声明了它容纳的元素的类型,而集合不声明。

 二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。

      三、数组不论是效率还是类型检查都是最好的。

1.数组是大小固定的,一旦创建无法扩容;集合大小不固定,

2.数组的存放的类型只能是一种,集合存放的类型可以不是一种(不加泛型时添加的类型是Object);

3.数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查(不懂),都是最快的.

  ArrayList就是基于数组创建的容器类.

数组Array和集合的区别:

 (1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)

(2)JAVA集合可以存储和操作数目不固定的一组数据。 (3)若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。

联系:使用相应的toArray()和Arrays.asList()方法可以回想转换

13.  StringBuffer和StringBuilder的区

String 字符串常量

StringBuffer字符串变量(线程安全)

StringBuilder字符串变量(非线程安全)

 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的

14.  String和StringBuffer的区别

Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符

15.  Java中String str=null和String str= 的区别

最大的区别在于Stringstr=null没有分配内存,String str=""分配了内存

2.Stringstr=null   这个引用指向了一个null ,没有地址没有值的地方

3,Stringstr=""   这个引用指向了一个地址,地址里面存的是空的字符

16.  使用运算符“==”和equals()方法的区别

   对象相等判断方法:首先==与equals()是有明显区别的

==强调栈中的比较,即理解为地址比较,而equals()强调内容上的比较

==是比较两个内存地址是否相同,相同为true,不相同为false;

equals():两个对象进行比较时,实际上是比较两个对象的地址值(从程序上来看这两个对象内容完全相等,但结果是不相等的,这是因为classA与classB的内容分别在不同的内存空间,指向了不同的内存地址);所以可以通过对equals()进行覆写,判断equal()方法里面的Object类对象是否与调用equals()的类是同一个类的实例(用instanceof判断),如果是,则进行向下转型,然后再调用String类中的equals()方法对属性进行比较

17.  接口和抽象类的区别

  接口与抽象类是不同的概念。抽象类是用于捕捉子类的通用特性,

接口是抽象方法的集合。接口可以继承一个或者是多个接口,抽象类

只能继承一个类或者实现多个接口;实现接口必须实现接口的所有方法

抽象类中可以有构造方法

抽象类中可以存在普通属性,方法,静态属性及方法

抽象类中可以存在抽象方法

如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定要有抽象方法

抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的

在接口中只有方法的声明,没有方法体

在接口中只有常量,因为定义的变量,在编译的时候都会默认加上 public static final

在接口中的方法,永远都被public来修饰

接口中没有构造方法,也不能实例化接口的对象

接口中的声明的成员默认为static final成员(不管是基本数据类型还是引用类型),且必须初始化;接口中声明的方法默认为public 且不能有实现体,即{  },方法体可以有参数;实现接口的类,必须实现接口中所有的方法,且不能降低方法的运用域,即必须显示声明为public;抽象类不需要实现接口的方法,抽象类也可以实现接口,但只能是实现部分或者是一个都不实现;在jdk8之后,添加了默认方法,在返回值加上default关键字,然后还有方法体,该接口被扩展时,可以直接继承或者说重新声明

 

 

19.  传统for和增强for的区别

增强for循环内部是使用的Iterator来遍历的,只能遍历数组和实现了Iterable接口的集合。优点是写法简便,无需获得数组、集合长度,也无需根据索引来访问元素。缺点是不能在循环里动态的删除元素和获取元素下标。

任何的增强for循环都可以改写为普通for循环。遍历集合所有元素的话用增强for循环更加简洁,如果是复杂的循环,还是用for循环比较好,for循环功支持索引取元素,可以使用下标来控制位置。

高级for有一个局限性,必须有被遍历的目标。建议在遍历数组的时候,还是希望使用传统for,因为传统for可以定义角标。凡是支持迭代器的都支持高级for

.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强for循环,也就是iterator。

20.  Collection和collections的区别

1.java.util.Collection是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。

2. java.util.Collections是一个包装类(工具类/帮助类)。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。

 

21.  线程的五种状态

   run()方法用来执行线程体中具体的内容

start()方法用来启动线程对象,使其进入就绪状态

sleep()方法用来使线程进入睡眠状态

22.  给成员变量赋值的方式有几种,分别怎么实现

23.  Throw和throws

throws关键字在方法声明处使用,throws后面接的是异常的类型;

throws可以声明多个异常,用逗号隔开;

如这样声明:voiddoIt(int age) throws ArithmeticException,Exception(){}

一个方法throws声明抛出异常后,那么调用该方法的时候必须处理声明的所有异常,可以使用try,catch逐一捕获或者继续使用throws进行声明。

24.  异常及异常的注意事项

(1)try、catch和finally这三个关键字不能单独使用,否则编译出错。

(2)try语句块后既可以只使用catch语句块,也可以只使用finally语句块。当与catch语句块一起使用时,可以存在多个catch语句块,而对于finally语句块只能存在一个。当catch与finally同时存在时,finally必须放在catch后面。

(3)try只与finally语句块使用时,可以使程序在发生异常后抛出异常,并继续执行方法中的后续代码。

(4)try只与catch语句块使用时,可以使用多个catch语句来捕获try语句块中可能发生的多种异常。异常发生后,Java虚拟机会由上而下来检测当前catch语句块所捕获的异常是否与try语句块中某个发生的异常匹配,若匹配,则不执行其他的catch语句块。如果多个catch语句块捕获的是同种类型的异常,则捕获子类异常的catch语句块要放在捕获父类异常的catch语句块前面。

(5)在try语句块中声明的变量是局部变量,只在当前try语句块中有效,在其后的catch、finally语句块或其他位置都不能访问该变量。但在try、catch或finally语句块之外声明的变量,可以在try、catch或finally语句块中访问。

(6)对于发生的异常,必须使用try…catch语句捕获,或者使用

throws向上抛出,否则编译出错。

(7)在使用throw语句抛出一个异常对象时,该语句后面的代码

将不会被执行。

25.  泛型

  泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数

 * 所有的泛型多的声明都有一个参数类型声明部分(由尖括号分隔,

 * 该参数类型声明部分在方法返回类型之前(在下面例子的<E>)

 * 每一个参数类型声明部分包含一个或者是多个类型参数,参数之间用逗号分隔。

 * 一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符

 * 类型参数能够用来声明返回值类型,并且能够作为泛型方法得到的实际参数类型的占位符

 * 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用类型,不能是原始类型

//泛型方法的定义:泛型参数列表置于返回值前,

如 public < T> void f(T t)

26.  线程和进程

1、首先是定义

进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。

线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。

2、一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。

3、线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。

4、线程没有地址空间,线程包含在进程的地址空间中。线程上下文只包含一个堆栈、一个寄存器、一个优先权,线程文本包含在他的进程的文本片段中,进程拥有的所有资源都属于线程。所有的线程共享进程的内存和资源

27.  基本数据类与包装类(自动装拆箱)

 装箱就是自动将基本数据类型转换为包装器类型;

拆箱就是 自动将包装器类型转换为基本数据类型。

Java中的数据类型分为两类:一类是基本数据类型,另一类是引用数据类型

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

30.  This和super

  首先要清楚在类方法中不能使用super,this关键字,而在实例方法中则可以用

1this三大作用:this调用属性、调用方法、利用this表示当前对象

1普通的直接引用:this相当于是指向当前对象本身;2形参与成员名字重名,用this来区分;3引用构造函数

2super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

1普通的直接引用,与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。2子类中的成员变量或方法与父类中的成员变量或方法同名3引用构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

3super和this的异同:

super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 

this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名   super.成员函数据名(实参)

this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

super()和this()均需放在构造方法内第一行。

尽管可以用this调用一个构造器,但却不能调用两个。

this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值