叨叨两句
- 学到脑袋疼,看来必须时刻保持血糖稳定,不然身体没法持续战斗
牛客网——java专项练习012
1
在某个类A中存在一个方法:void set(int x),以下不能作为这个方法的重载的声明的是()
正确答案: A 你的答案: A (正确)A void set(int y)
B int set(int x,double y)C double set(int x,int y)D void set(int x,int y)方法重载满足的条件 1. 同一个类中,方法名相同,参数列表不同的2个或多个方法构成方法的重载 2.参数列表不同指参数的类型,参数的个数,参数的顺序至少一项不同 3.方法的返回值类型,方法的修饰符可以不同。
2
下列说法正确的有()
正确答案: C 你的答案: C (正确)A class中的constructor不可省略
B constructor必须与class同名,但方法不能与class同名C constructor在一个对象被new时执行D 一个class只能定义一个constructorB选项错在普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值
3
执行下列代码的输出结果是( C )
A 10B 20C 30D 40public class Demo{ public static void main(String args[]){ int num = 10; System.out.println(test(num));}public static int test(int b){ try { b += 10; return b; } catch(RuntimeException e) { } catch(Exception e2) { } finally { b += 10; return b; } }}
推荐博文try-catch-finally执行顺序详解:
try块中抛出异常,try、catch和finally中都有return语句public static int WithException(){ int i=10; try{ System.out.println("i in try block is : "+i); i = i/0; return --i; } catch(Exception e){ System.out.println("i in catch - form try block is : "+i); --i; System.out.println("i in catch block is : "+i); return --i; } finally{ System.out.println("i in finally - from try or catch block is--"+i); --i; System.out.println("i in finally block is--"+i); return --i; }}执行结果:============WithException==================i in try block is : 10i in catch - form try block is : 10i in catch block is : 9i in finally - from try or catch block is--8i in finally block is--76===============================执行顺序:抛出异常后,执行catch块,在catch块的return的--i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6。结论:try块中抛出异常,try、catch和finally中都有return语句,返回值是finally中的return。总体结论:结论一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)结论二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四:(1)return语句只在函数最后出现一次。(2)return语句仅在try和catch里面都出现。(3)return语句仅在try和函数的最后都出现。(4)return语句仅在catch和函数的最后都出现。注意,除此之外的其他做法都是不可行的,编译器会报错
4
What will be printed when you execute the following code?
class C { C() { System.out.print("C"); }} class A { C c = new C(); A() { this("A"); System.out.print("A"); } A(String s) { System.out.print(s); }} class Test extends A { Test() { super("B"); System.out.print("B"); } public static void main(String[] args) { new Test(); }}
正确答案: B 你的答案: B (正确)
A BB
B CBBC BABD None of the above初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 3.其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法;4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法; (1)初始化父类的普通成员变量和代码块,执行 C c = new C(); 输出C (2)super("B"); 表示调用父类的构造方法,不调用父类的无参构造函数,输出B (3) System.out.print("B"); 所以输出CBB
5
下面代码运行结果是()
public class Test{
public int add(int a,int b){ try { return a+b; } catch (Exception e) { System.out.println("catch语句块"); } finally{ System.out.println("finally语句块"); } return 0;} public static void main(String argv[]){ Test test =new Test(); System.out.println("和是:"+test.add(9, 34)); }
}
正确答案: C 你的答案: C (正确)
A catch语句块
和是:43B 编译异常
C finally语句块
和是:43D 和是:43
finally语句块先来看一段代码: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; } }}/**output:1*/从结果上看,貌似`finally` 里的语句是在`return` 之后执行的,其实不然,实际上`finally` 里的语句是在在`return` 之前执行的。那么问题来了,既然是在之前执行,那为什么`a` 的值没有被覆盖了?实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行`a = 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。再来看一个例子,稍微改下上面的程序: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; return a; } }}/**output:2*/在这里,finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.
6
往OuterClass类的代码段中插入内部类声明, 哪一个是错误的:
public class OuterClass{
private float f=1.0f;//插入代码到这里
}
正确答案: A B C D 你的答案: 空 (错误)A class InnerClass{
public static float func(){return f;}}B abstract class InnerClass{
public abstract float func(){}}C static class InnerClass{
protected static float func(){return f;}}D public class InnerClass{
static float func(){return f;}}这是我学习Java内部类的笔记1.为什么使用内部类?使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响1.1.使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,使用内部类还能够为我们带来如下特性:(1)、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独。(2)、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。(3)、创建内部类对象的时刻并不依赖于外围类对象的创建。(4)、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。(5)、内部类提供了更好的封装,除了该外围类,其他类都不能访问。2.内部类分类:(一).成员内部类:public class Outer{ private int age = 99; String name = "Coco"; public class Inner{ String name = "Jayden"; public void show(){ System.out.println(Outer.this.name); System.out.println(name); System.out.println(age); } } public Inner getInnerClass(){ return new Inner(); } public static void main(String[] args){ Outer o = new Outer(); Inner in = o.new Inner(); in.show(); } }1.Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等2.Inner 类中定义的 show() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性age3.定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );4.编译上面的程序后,会发现产生了两个 .class 文件: Outer.class,Outer$Inner.class{}5.成员内部类中不能存在任何 static 的变量和方法,可以定义常量:(1).因为非静态内部类是要依赖于外部类的实例,而静态变量和方法是不依赖于对象的,仅与类相关,简而言之:在加载静态域时,根本没有外部类,所在在非静态内部类中不能定义静态域或方法,编译不通过;非静态内部类的作用域是实例级别(2).常量是在编译器就确定的,放到所谓的常量池了★★友情提示:1.外部类是不能直接使用内部类的成员和方法的,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法;2.如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字,如:Outer.this.name(二).静态内部类: 是 static 修饰的内部类,1.静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问 2.如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员3.创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名 = new 内部类();public class Outer{ private int age = 99; static String name = "Coco"; public static class Inner{ String name = "Jayden"; public void show(){ System.out.println(Outer.name); System.out.println(name); } } public static void main(String[] args){ Inner i = new Inner(); i.show(); } }(三).方法内部类:访问仅限于方法内或者该作用域内 (1).局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的(2).只能访问方法中定义的 final 类型的局部变量,因为:当方法被调用运行完毕之后,局部变量就已消亡了。但内部类对象可能还存在,直到没有被引用时才会消亡。此时就会出现一种情况,就是内部类要访问一个不存在的局部变量;==>使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期.局部内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数;防止被篡改数据,而导致内部类得到的值不一致 /* 使用的形参为何要为 final??? 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的, 也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的, 毕竟站在程序的角度来看这两个根本就是同一个,如果内部类该变了,而外部方法的形参却没有改变这是难以理解 和不可接受的,所以为了保持参数的一致性,就规定使用 final 来避免形参的不改变 */ public class Outer{ public void Show(){ final int a = 25; int b = 13; class Inner{ int c = 2; public void print(){ System.out.println("访问外部类:" + a); System.out.println("访问内部类:" + c); } } Inner i = new Inner(); i.print(); } public static void main(String[] args){ Outer o = new Outer(); o.show(); } } (3).注意:在JDK8版本之中,方法内部类中调用方法中的局部变量,可以不需要修饰为 final,匿名内部类也是一样的,主要是JDK8之后增加了 Effectively final 功能http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html反编译jdk8编译之后的class文件,发现内部类引用外部的局部变量都是 final 修饰的 (四).匿名内部类:(1).匿名内部类是直接使用 new 来生成一个对象的引用;(2).对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用;(3).使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口;(4).匿名内部类中是不能定义构造函数的,匿名内部类中不能存在任何的静态成员变量和静态方法;(5).匿名内部类中不能存在任何的静态成员变量和静态方法,匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法(6).匿名内部类初始化:使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果 public class OuterClass { public InnerClass getInnerClass(final int num,String str2){ return new InnerClass(){ int number = num + 3; public int getNumber(){ return number; } }; /* 注意:分号不能省 */ } public static void main(String[] args) { OuterClass out = new OuterClass(); InnerClass inner = out.getInnerClass(2, "chenssy"); System.out.println(inner.getNumber()); } } interface InnerClass { int getNumber(); }