【JAVA】JAVA基础知识点备忘,
【JAVA】JAVA基础知识点备忘,
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为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
- 所有的数据域都是私有的.
- 没有修改器方法
- 没有可以返回指向可变数据域的引用的访问器方法
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,如下:
//Good
if("constant".equals(userVo.getName()))
//Bad
if(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.
相关文章
- 暂无相关文章
用户点评