【JAVA】JAVA基础知识点备忘

来源:互联网 发布:unity3d架构 编辑:程序博客网 时间:2024/05/22 06:44

1.内存分析,内存一共分为四个部分:
  • stack segment: 存放局部变量
  • heap segment : 存放new关键字创建的东西,例如类的对象
  • data segment : 存放静态变量和字符串常量(打印到控制台的文本)
  • code segment : 存放程序的代码

2.面向对象编程的思维:
  • 考虑这个实际问题中存在哪些类和对象
  • 考虑这些类和对象有哪些数据成员和方法
  • 考虑这些类和对象之间的关系

3.如何在内存中区分类和对象?
  • 类是静态的概念,存在于代码区
  • 对象是new运算符创建出来的,位于堆内存中,类的每个实例成员变量在不同的对象中都有不同的值;而方法只有一份,执行的时候才占用内存


4.对象:是指栈空间内的一小块内存指向堆空间的一大块内存


5.方法执行完毕后,为这个方法所分配的所有的局部变量会全部消失


6.必须使用new关键字来创建对象


7.在给函数命名时,用一个动词加S,代表着第三人称的含义,例如:contains


8.同一个类的每个对象共享该类的静态方法,非静态的方法是针对每一个对象调用的


9.关于this关键字:
  • 在类的方法定义中使用,代表使用该方法的对象的引用
  • 当必须要指出当前使用该方法的对象是谁时,要使用this
  • 有时使用this可以处理方法中成员变量和参数重名的情况
  • this可以看做一个变量值是当前对象的引用
  • this还可以在一个构造方法中调用其所属的另外一个构造方法;当用this调用另外一个构造方法时,传递的参数不能是关键字this或当前对象的实例成员

10.强制启用垃圾回收器:System.gc();


11.写程序时,一般把所有的数据成员声明为private的,然后再为他们一一定义getXXX()方法;而每一个方法则声明为public的


12.静态方法不能访问非静态成员,静态方法不再是针对于某个具体的对象来调用,非静态成员专属于某一个特定对象,非静态成员的访问需要通过对象


13. 如果要把一个类放在package中:先放在package中,但是编译的文件必须位于正确的目录下(和package的层次完全一致);
如果想在另外一个类中使用该类,则必须把名字写全,但是为了方便,可以在程序的最前面引入,例如:import com.xxx.yyy.* ;
访问同一个包中类时,不需要引用;java-->lang中的类使用的话不需要被引入,可直接使用.


14.继承: A extends B   ( A是一种B  )
  • 通过继承,子类自动拥有了基类的所以成员(数据成员和一般方法,但不包括构造方法)
  • java只支持单继承
  • 一个子类只拥有一个基类,但是一个基类可以拥有多个子类

15.方法重写:
  • 重写方法必须拥有与被重写方法一样的方法名,返回值类型和参数列表
  • 重写方法不能比被重写方法有更严格的访问权限


16.访问权限之间的严格程度比较:
    public < protected < default < private


17.super关键字:
  • 指向父类的对象(引用基类的成分),和this功能相似


18.继承中的构造方法:
  • 子类的构造过程中,必须调用基类的构造方法
  • 子类可以在自己的构造方法中使用super(形参)调用基类的构造方法
  • 如果用super关键字调用基类的构造方法,则必须写在子类构造方法的第一行
  • 如果子类的构造方法中没有显示的调用父类的构造方法,则系统默认调用基类的无参构造方法
  • 如果既没有显示的调用父类的构造方法,又没有调用无参的构造方法,则编译出错


19.多态存在的三个条件:
  • 要有继承
  • 要有重写
  • 父类引用指向子类对象


20.抽象方法( public abstract void methodname() ):

  • 含有抽象方法的类必须被声明为抽象类
  • 抽象类必须被继承,抽象方法必须被重写
  • 抽象类不能被实例化
  • 抽象方法只需声明不需实现


21.final关键字:
  • final的变量值不能改变
  • final的方法不能被重写
  • final的类不能被继承


22.interface(接口):是一种抽象类,只包含变量和方法的定义,而没有实现。
  • 接口可以多重实现
  • 接口中声明属性默认为public static final的;也只能是public static final
  • 接口中只能定义抽象方法,而这些方法默认为public的,也只能是public
  • 接口可以继承其他的接口,并添加新的抽象方法和属性
  • 多个无关的类可以实现同一个接口
  • 一个类可以实现多个无关接口
  • 与继承关系相似,接口与实现类之间存在多态性 

23.
类String的equals()方法已经被重写,当比较的两个String类代表的字符串的字符序列完全相等时,返回true,否则返回false。

24.
类Object的equals()方法比较的是两个引用是否指代同一个对象(指向同一块内存区域)。


25.对象转型(casting):
  • 一个基类的引用型变量可以指向其子类的对象。
  • 一个基类的引用不可以访问其子类新增加的成员(属性和方法)。
  • 可以使用引用变量 instanceof 类名 来判断该引用类型变量所指向的对象是否属于该类或该类的子类。
  • 子类的对象可以当做基类的对象来使用称作向上转型(upcasting)。
  • 基类的对象可以当做基类的对象来使用称作向下转型(downcasting)。

26.多态的概念:
  • 动态绑定(多态)是指在执行期间(而非绑定期间)判断所引用的对象的实际类型,根据其实际的类型调用实际的方法。

27.异常和重写的关系:
  • 重写方法需抛出与原方法所抛出异常类型一致异常或不抛出异常。

28.接口和抽象类的区别是什么?

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

  • 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
  • 类可以实现很多个接口,但是只能继承一个抽象类
  • 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
  • 抽象类可以在不提供接口方法实现的情况下实现接口。
  • Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
  • Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
  • 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的

29.有三种方式可以用来创建线程:

  • 继承Thread类
  • 实现Runnable接口
  • 应用程序可以使用Executor框架来创建线程池

实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

 

30.线程的几种可用状态

线程在执行过程中,可以处于下面几种状态:

  • 就绪(Runnable):线程准备运行,不一定立马就能开始执行。
  • 运行中(Running):进程正在执行线程的代码。
  • 等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。
  • 睡眠中(Sleeping):线程被强制睡眠。
  • I/O阻塞(Blocked on I/O):等待I/O操作完成。
  • 同步阻塞(Blocked on Synchronization):等待获取锁。
  • 死亡(Dead):线程完成了执行。

31.HashMap和Hashtable的区别

  • HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
  • HashMap允许键和值是null,而Hashtable不允许键或者值是null。
  • Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
  • HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
  • 一般认为Hashtable是一个遗留的类。

 

32.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

下面列出了Array和ArrayList的不同点:

  • Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
  • Array大小是固定的,ArrayList的大小是动态变化的。
  • ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
  • 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

33.ArrayList和LinkedList有什么区别?

ArrayList和LinkedList都实现了List接口,他们有以下的不同点:

  • ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

  • 相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

  • LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。


34.要使一个类成为不可变的,那么必须满足一下三个条件:
  • 所有的数据域都是私有的.
  • 没有修改器方法
  • 没有可以返回指向可变数据域的引用的访问器方法


35.在Java中,非静态(匿名)内部类会引用外部类对象。而静态内部类不会引用外部类对象。


36.Java泛型中,

  • E 代表Elements,作为容器中的元素.
  • T 代表Type,作为Java中的Class
  • ? 代表未知类型.
  • K 代表Key,作为键.
  • V 代表Value,作为值.
  • <? extends A> 代表类型为类A的子类.

  • <? super B> 代表类型为B的父类.

37. 在Java中,一个弱引用指向的对象,只要被垃圾回收器扫描到就会被回收.


38.对于参数类型,要优先使用接口,而不是类.只要有适当的接口可用来定义参数,就优先使用这个接口,而不是使用实现该接口的类.例如,在编写方`   法时使用HashMap类来作为输入,相反应当使用Map接口来作为参数,这使你可以HashTable,HashMap,TreeMap来作为参数,这样更加灵活.


39.终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的.使用终结方法会导致行为不稳定,降低性能,以及可移植问题.


40.通过把字符串常量放在比较函数equals()的左侧来防止NullPointerException,如下:

//Goodif("constant".equals(userVo.getName()))//Badif(userVo.getName().equals("constant")


41.无论任何时候有一个集合或数组,都要确保它存在且不为空.


42.看下一段代码:

String a = “hello2″;   String b = “hello” + 2;   System.out.println((a == b));

输出结果为true. "hello" + 2在编译期间就被优化成"hello2",因此在运行期间,a和b指向同一块内存.


String a = “hello2″;    String b = “hello”;       String c = b + 2;       System.out.println((a == c));

输出结果为false.由于有符号引用的存在,c = b + 2不会在编译期被优化,不会把b+2当做字面常量来处理,因此这种方式生成的对象是保存在heap上的.


(通过new关键字来生成对象是在heap segment进行的,而在heap segment进行对象生成的过程是不会检测该对象是否已经存在的).


43.

44.

45.

36.

36.

36.

36.

0 0