Java第一阶段复习

1.垃圾回收?

程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收仍然不确定。

2.static,final,abstract,interface之间的关系?

static可以修饰除构造器以外的类成员,静态的类成员是针对类的,非静态的类成员是针对对象的。
final修饰的类不能被继承,final修饰的方法不能被重写,final修饰的变量值不能被更改。
abstract修饰的方法是抽象方法,只有方法的声明,没有方法体,含有抽象方法的类必须声明为抽象类,但是抽象类不一定有抽象方法。抽象类不能实例化,但一定有构造器,Java是单继承的语言。
interface是定义接口的关键字,implements是继承接口的关键字。接口是除了类和数组外的第三种引用数据类型,和类不同的地方就是它的内部主要就是封装了方法和静态常量。接口里面的属性,默认就是public static final修饰的;接口里面的方法,默认就是public abstract修饰的。
abstract不能被private修饰,不能和static同时使用。abstract不能和final同时使用,因为abstract要被子类继承,但final不能有子类。

3.定义类和声明类的区别?

定义是为一个变量分配了内存空间,而声明只是说告诉编译器有这么一个类存在。class A;这是声明类,class B{ //… };这是定义类。

4.抽象类和接口的区别?

一个类声明方法存在,而不去实现,这个类是抽象类。抽象类适用于创建一个要体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。抽象类不能实例化,但是可以创建一个变量,类型是抽象类,并让这个变量指向一个具体子类的实例。不能有抽象构造函数或者抽象静态方法。
接口是抽象类的变体。接口中所有方法都是抽象的,没有方法体。接口只可以定义static final成员变量。接口可以继承接口,抽象类可以继承实体类,但不能继承final修饰符修饰的类,也不能继承只有私有的构造函数的实体类。

5.构造器和其他方法的区别?

构造器=构造方法=构造函数。构造器的作用是初始化对象,不能有返回值,默认返回的是对象,构造器是隐式调用的,没有定义构造器时,Java编译器会默认提供一个无参构造器,构造器的名称必须和类名相同。
普通方法:方法体中直接定义对象的属性,行为,一般都有返回值,没有返回值的情况用void,方法的使用要通过显式调用,任何时候都不会默认提供方法。
在定义类时,如果这个类是public修饰的,那么类名要与文件名相同。jvm加载类时会默认加载public修饰的类,一般把主方法写在public修饰的类中。

6.final,finally,finalize的区别?

final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。抽象类就是用来被继承的,但是final不能有子类,所以final和abstract不能同时使用。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。final修饰的变量就成了常量,只能赋值一次。被声明为final的方法也同样只能使用,不能重载。
finally—在异常处理时,提供finally代码块来执行任何清除操作。finally代码块里的代码一定会被执行。
finalize—方法名。在垃圾收集器将对象从内存中清除出去之前,Java 技术允许使用finalize()方法做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的,只能由虚拟机调用这个方法,我们不能在类中调用这个方法。

7.this和super的区别?

this的使用场景:区别成员变量和局部变量,调用类中的其他方法,调用类中的其他构造器。
this的含义就是所在类的当前对象的引用(地址值),即对象自己的引用。方法被哪个对象调用,方法中的this就代表哪个对象,this就代表谁。
this访问的是本类中的属性和方法,如果本类没有此属性和方法,就会从父类中继续查找,调用本类的构造器时,this必须放在首行。
super的使用场景:访问父类中的属性,调用父类中的方法,调用父类中的构造器。
super直接访问父类的属性和方法,调用父类构造器时,也必须放在首行。

8.在子类的构造器中,为什么要调用父类的构造器?

为了初始化父类的参数,所以一定会默认调用父类的构造器。

9.怎么理解时编译看左边,运行时看右边?

成员变量,静态方法看左边;非静态方法编译看左边,运行看右边。在多态情况下,编译看左边是指看父类的引用,运行看右边是指看子类的对象,因为实际运行的是子类重写父类的方法。

10.怎么理解向上转型?

向上转型(子类转父类):多态本身就是子类的对象赋值给父类的引用,这就是一个自动向上转型的过程(类型自动转换)。

11.方法的重载和重写是什么?

方法重载是类中有多个方法,具有相同的方法名,但方法的参数各不相同。
方法重写是子类和父类中出现了相同的方法,但方法的内容不同。

12.如何写一个单例模式?

package com.chouhan.thread;

/**
 * 单例设计模式之懒汉式(线程安全)
 * @author chouhan 
 * 
 * 双重检查锁定:就是通过给静态方法加锁,然后进行两层判断,
 * 作用就是实现只能实例化一个对象,所以同一个对象的instance值就都是一样的的
 */
public class SingletonTest {
	public static void main(String[] args) {
		// 通过双重锁-->创建的是同一个类中的同一个对象-->所以两个对象的instance都是null
		Singleton s = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		// 所以是在同一个main方法/主线程中创建了同一个对象
		System.out.println(s == s2);
	}
}

class Singleton {
	private static Singleton instance = null;

	private Singleton() {
	}
	// 1.给getInstance方法加锁,保证了线程安全,但是每次调用这个方法都要进行锁定判断
//	synchronized public static Singleton getInstance() {
//		if(instance==null) {
//			instance=new Singleton();
//		}
//		return instance;
//	}

	// 2.给instance=new Singleton();进行加锁
	// 但这样没有实现单例对象的唯一性,A创建完之后B并不会知道,就会创建新的单例
//	public static Singleton getInstance() {
//		if(instance==null) {
//			synchronized (Singleton.class) {
//				instance=new Singleton();
//			}
//		}
//		return instance;
//	}

	// 3.采用双重检查锁定的方法
	public static Singleton getInstance() {
		// 第一重判断,判断对象是否已经实例化
		if (instance == null) {
			// 给代码块加锁,锁对象是?-->给当前方法的类对象Singleton加锁
			synchronized (Singleton.class) {
				// 第二重判断的作用是,如果有一个线程1取到了锁,就再进第二层实例化;
				// 这个时候,有另一个线程2取到了锁,来到第二层发现已经有实例了就不会再创建单例
				if (instance == null) {
					// 创建单例实例
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

14.length属性和length()方法?

数组没有length()方法,但是有length属性;String类和File类有length()方法;ArrayList没有length()方法,但有size()方法获取有效元素个数。

15.Collection和Collections的区别?

Collection是集合类的上级接口,继承于它的接口主要是Set接口和List接口。
Collections是针对集合类的一个帮助类,提供一系列静态方法操作集合,比如搜索、排序、线程安全化等。

16.HashMap和HashTable的区别?

HashMap与HashTable都实现了Map接口。由于HashMap的非线程安全性,效率上可能高于HashTable。HashTable的方法是Synchronize的,而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
HashMap允许将null作为一个entry的key或者value,而HashTable不允许。
HashMap把HashTable的contains方法去掉了,改成containsValue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map接口的一个实现。
HashTable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
Hashtable不可以存储null键和null值,HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。
Hashtable是JDK1.0版本出现的,是线程安全的,效率低;HashMap是JDK1.2版本出现的,是线程不安全的,效率高。

17. sleep()和wait()的区别?

sleep是线程类Thread的方法,导致此线程暂停执行时间,把执行机会交给其他线程,但是监控状态依然保持,到时间后会自动恢复,调用sleep不会释放对象锁。
wait是Object类的方法,对某个线程对象调用wait方法会导致这个线程放弃对象锁,进入锁定池,只有调用这个线程对象notify()(或者notifyAll()方法)后,这个线程才能进入对象等待池准备获取对象锁进入运行状态。

18.线程、程序、进程之间的关系?

线程可以彼此独立的执行,它是一种实现并发机制的有效手段,可以同时使用多个线程来完成不同的任务,并且一般用户在使用多线程时并不考虑底层处理的细节。
程序是一段静态的代码,是软件执行的蓝本。进程是程序的一次动态执行过程,即是处于运行过程中的程序。
线程是比进程更小的程序执行单位,一个进程可以启动多个线程同时运行,不同线程之间可以共享相同的内存区域和数据。多线程程序是运行时间后嗣可能出现在一个进程之内的、有一个以上线程同时运行的情况的程序。

19.wait()、notify()、notifyAll()的作用分别是什么?

Object.wait()阻塞等待,必须获得共享对象的锁;
Object.notify()叫醒一个,必须获得共享对象的锁;
Object.notifyAll()叫醒所有,必须获得共享对象的锁。
wait与notify()之间必须有共享对象,确保wait()在notify()之前。

20.Linux系统中touch、cp、mv命令的区别?

touch的创建文件,文件已经存在就修改文件更新的时间;
cp是复制文件,要复制过去的文件存在就覆盖它,不存在就创建后复制,
要是把多个文件复制到一个目录,那么文件和目录都要存在,
要是把一个目录复制到另一个目录,要复制过去的目录不存在就创建,然后把自己名下的东西都送过去,存在就带上家底把自己一起送过去;
mv是移动文件,移动目录到目录时,如果要移动过去的目录存在就修改那个目录的名字。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值