笔试题目-纯java篇
java中方法通常采用驼峰命名法:首字符小写,后面每个单词首字母大写。
类名各个单词首字母都大写
关键字
访问修饰符: 要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问--用default(即什么也不用)
default和protected的区别是:
前者只要是外部包,就不允许访问。
后者只要是子类就允许访问,即使子类位于外部包。try语句块
public abstract class Test { public static void main(String[] args) { System.out.println(beforeFinally()); } public static int beforeFinally(){ int a = 0; try{ a = 1; return a; }finally{ a = 2;//若在此返回2,这最终会输出2. } } } output: 1
实际过程是这样的:当程序执行到
try{}
语句中的return
方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}
中的程序, 在执行a = 2
时,程序仅仅是覆盖了a
的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序finally
的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。
- 所有异常和错误都是Throwable子类
- 接口interface和抽象类abstract
实现接口,就要实现接口的所以方法,相当于重写方法,方法的重写需要满足:三同一大一小(方法名、返回值类型、形参相同;访问权限>=重写前;抛出异常<=重写前)
不能被new出来自然就没有构造器。 - 面向对象
- 继承extends:子类可以继承父类的所有public方法(私有属性无法被继承);
在父类中有private的name=“张三”属性,在子类中若也定义了这个且name="李四";则this.name为李四,super.name为张三。
- super:子类构造器中第一行默认会调用父类无参构造器
super();
;super只能出现在子类的方法或构造方法中; - 多态:若B是A子类,且
B b=new A()
,则b.fun()
调用的是B的方法;多态是方法的多态,而不是属性的;对象能执行哪些方法主要看
=
号左边的;
假设a是一个学生,a instanceof Person
判断类型,并用(Person)a
强制类型转换(下转上);
父类引用可以直接指向子类对象。
static
在一个类中,static
用在方法前时,与类同时加载;而非static方法是在实例化的时候才加载的。
类中的static
方法要想调用当前类中的其他方法也只能调用静态方法。且调用方式为类名.方法名
一个类中的私有静态变量可以用类名.变量名
使用。内部类
有成员内部类 局部内部类(定义在方法中) 匿名内部类Outer outer = new Outer(); Outer.inner inner = Outer.new Inner(); //Inner在Outer类内部,需要public。
public class Outer{ private int id; public class Inner{ //内部类可以获得外部类的私有属性 }//若改为静态内部类就不能取得私有属性 }
一个java文件只有一个public类,可以有多个其他class,其他内也叫内部类:
匿名内部类:
没有名字初试化类,不用将实例保存到变量中。
运算符优先级
- 加减法:
int a =100,b=50,c=a---b,d=a---b;
先考虑a--,a执行后自减操作,即先用a后再自减1,与--a先反
(1)c=a---b,先执行a-b操作,得到c=50,再执行a减1操作,得到a=99
(2)d=a---b,先执行a-b操作,得到d=49,再执行a减1操作,得到a=98
JVM
控制台命令
javac -d destination 目的地 -s source 起源地java内存分析
int[] a=null;
时在栈区会创建a,此时堆区没有任何东西;new int[10]
后才会在堆中开辟一个大小为10的空间。数组也是一种引用类型(除了八种基本类型外都是),故它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式初始化了。
public class Pet { String name; int age; public void shot(){ System.out.println("叫了一声"); } } public class Demo { public static void main(String[] args) { Pet dog = new Pet(); dog.name = "旺财"; dog.age = 1; dog.shot(); System.out.println(dog.name); System.out.println(dog.age); } }
- 首先加载Demo类以及里面的main方法,还有字符串之类的常量池到
堆
中的方法区
; - 然后将main方法压入栈底(故main退栈时基本代表程序执行结束);
- main方法中
dog = new Pet()
时会把pet类加载到方法区;同时在栈中引用dog变量名;并在堆中建立dog对象。(在堆中shout()时调用的是方法区中的shout()方法)
详情参考:创建对象的过程详解