java 面试复习 1

Tue, Feb 16, 2021 3-minute read

类 {

main{


新对象

对象.属性;

对象.方法
}

对象{
    属性,
    方法
}

}

封装性

体现一:将类的属性 xxx 私化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值(public, private 等四种权限都是封装性的体现)

体现二:不对外暴露的私有的方法

体现三:单例模式(将构造器私有化)

体现四:如果不希望类在包外被调用,可以将类设置为缺省的

多态的好处

没有了多态,就必须多造备注掉的两个 func(Dog dog),func(Cat cat)两个类,有了多态,只用一个 animal 后,就可以直接调用 test.func(new Dog()),animal 的子类。

public class AnimalTest {
	
	public static void main(String[] args) {
		
		AnimalTest test = new AnimalTest();
		test.func(new Dog());
		
		
		test.func(new Cat());
	}
	
	public void func(Animal animal){//Animal animal = new Dog();
		animal.eat();
		animal.shout();
		
	}
	
//	public void func(Dog dog){
//		dog.eat();
//		dog.shout();
//	}
//	public void func(Cat cat){
//		cat.eat();
//		cat.shout();
//	}
}


class Animal{
	
	
	public void eat(){
		System.out.println("动物:进食");
	}
	
	public void shout(){
		System.out.println("动物:叫");
	}
	
	
}

class Dog extends Animal{
	public void eat(){
		System.out.println("狗吃骨头");
	}
	
	public void shout(){
		System.out.println("汪!汪!汪!");
	}
	
	public void watchDoor(){
		System.out.println("看门");
	}
}
class Cat extends Animal{
	public void eat(){
		System.out.println("猫吃鱼");
	}
	
	public void shout(){
		System.out.println("喵!喵!喵!");
	}
}

对象的多态性

Person p = new Students();

new 的对象体现的是多种形态:父类的引用指向子类的对象

虚拟方法调用

编译时看左边,运行时看右边

equals()方法

  • java.lang.Object 类: Object 类是所 Java 类的根父类, 只声明了一个空参的构造器

  • Object 类中 equals()的定义:

     public boolean equals(Object obj) {
	        return (this == obj);
	  }

说明:Object 类中定义的 equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体

通常情况下,我们自定义的类如果使用 equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们

  • 就需要对 Object 类中的 equals()进行重写.
  • 重写的原则:比较两个对象的实体内容是否相同.
class User{
String name;
int age;
	//重写其equals()方法
	public boolean equals(Object obj){
        // 判断地址相同,相同就直接true
		if(obj == this){
			return true;
		}
        // 判断obj是不是一个User,然后转成User,才能出现.age和.name来判断
		if(obj instanceof User){
			User u = (User)obj;
			return this.age == u.age && this.name.equals(u.name);
		}
		return false;
	}
}

Java 中的 JUnit 单元测试

  • 步骤:

  • 1.中当前工程 - 右键择:build path - add libraries - JUnit 4 - 下一步

  • 2.创建 Java 类,进行单元测试。

  • 此时的 Java 类要求:① 此类是 public 的 ②此类提供公共的无参的构造器

  • 3.此类中声明单元测试方法。

  • 此时的单元测试方法:方法的权限是 public,没返回值,没形参

  • 4.此单元测试方法上需要声明注解:@Test,并在单元测试类中导入:import org.junit.Test;

  • 5.声明好单元测试方法以后,就可以在方法体内测试相关的代码。

  • 6.写完代码以后,左键双击单元测试方法名,右键:run as - JUnit Test

  • 说明:

  • 1.如果执行结果没任何异常:绿条

  • 2.如果执行结果出现异常:红条

代码块

对 Java 类或对象进行初始化

class Person {
public static int total;
static {
total = 100;//为total赋初值
}
…… //其它属性或方法声明
}

 静态代码块:用 static 修饰的代码块

  1. 可以有输出语句。
  2. 可以对类的属性、类的声明进行初始化操作。
  3. 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
  4. 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
  5. 静态代码块的执行要先于非静态代码块。
  6. 静态代码块随着类的加载而加载,且只执行一次

非静态代码块:没有 static 修饰的代码块

  1. 可以有输出语句。
  2. 可以对类的属性、类的声明进行初始化操作。
  3. 除了调用非静态的结构外,还可以调用静态的变量或方法。
  4. 若有多个非静态的代码块,那么按照从上到下的顺序依次执行。
  5. 每次创建对象的时候,都会执行一次。且先于构造器执行
class Person {
public static int total;
static {
total = 100;
System.out.println("in static block!");
}
}
public class PersonTest {
public static void main(String[] args) {
System.out.println("total = " + Person.total);
System.out.println("total = " + Person.total);
}
}

in static block total=100 total=100

idea 配置

bin 打开 idea.exe.vmoptions

-Xms128m
-Xmx750m
-XX:ReservedCodeCacheSize=512m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-XX:CICompilerCount=2
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-ea
-Dsun.io.useCanonCaches=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-Djdk.attach.allowAttachSelf=true
-Djdk.module.illegalAccess.silent=true
-Dkotlinx.coroutines.debug=off

64 位系统,内存大于 8G,开发大型项目,java/android 项目,修改以下三个参数:

-Xms128m//

-Xms512m
设置初始内存数,提高java程序启动速度
-Xmx750m//

-Xmx1500m
这个数值可以减少内存Garage收集频率,提高程序性能

-XX:ReservedCodeCacheSize=512m

500m,


idea 中的快捷键

  • 1.补全代码的声明:Ctrl+Shift+Space
  • 1.1 补全: Alt + Enter
  • 1.2 类名或接口名提示: Ctrl + Alt + 空格
  • 1.3 引入方法返回值对应的变量: Ctrl + Alt + V
  • 2.快速打开方法: Alt + 鼠标左键
  • 3.使用单行注释:ctrl + /
  • 4.使用多行注释: ctrl + shift + /
  • 5.方法间快速移动:Alt+Up Alt+Down
  • 6.复制指定行的代码:Ctrl + D
  • 7.删除指定行的代码:ctrl + X
  • 7.显示方法的参数信息:Ctrl + P
  • 8.上下移动代码:Shift + Alt + Up / Shift + Alt + Down
    1. 将一段代码抽取成方法: Crtl + Alt + M
  • 9.切换到下一行代码空位:shift + enter

  • 12.将光标移到前或后编辑历史记录处: Ctrl+ Alt+ Right

  • 12.1 跳到大括号的开头/结尾: Ctrl+[ / Ctrl+]

  • 12.2 高亮错误或警告快速定位 F2 / Shift + F2

  • 22.格式化代码: Ctrl+Alt+L

  • 23.选中数行,整体往后移动:tab

  • 24.选中数行,整体往前移动:shift + tab

  • 25 浮动窗显示类结构,通过输入关键词完成快速定位类元素:Ctrl + F12

  • 26.重命名变量、文件、类等:Shift + F6

  • 27.字母大小写转换: Ctrl + Shift + U

  • 30.调出生成 getter/setter/构造器等结构: Alt+Insert

  • 30.把代码包在一块内,例如 try/catch: Ctrl+Alt+T

  • 32.快速查找:ctrl + F

  • 32 查找类比如 StringBuffer 里面的所有的方法:ctrl + F12

  • 33.关闭当前其他窗口:alt + 关闭窗口


Ok, It’s time for Thread1