- 学到脑壳疼,看来必须时刻保持血糖稳定,否则身体无法持续战斗
在某个类A中存在一个方法:void set(int x),如下不能做为这个方法的重载的声明的是()
正确答案: A 你的答案: A (正确)html
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)java
方法重载知足的条件 1. 同一个类中,方法名相同,参数列表不一样的2个或多个方法构成方法的重载 2.参数列表不一样指参数的类型,参数的个数,参数的顺序至少一项不一样 3.方法的返回值类型,方法的修饰符能够不一样。
下列说法正确的有()
正确答案: C 你的答案: C (正确)程序员
A class中的constructor不可省略
B constructor必须与class同名,但方法不能与class同名
C constructor在一个对象被new时执行
D 一个class只能定义一个constructororacle
B选项错在普通的类方法是能够和类名同名的,和构造方法惟一的区分就是,构造方法没有返回值
执行下列代码的输出结果是( C )
A 10
B 20
C 30
D 40函数
public 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执行顺序详解:http://qing0991.blog.51cto.co...学习
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 : 10 i in catch - form try block is : 10 i in catch block is : 9 i in finally - from try or catch block is--8 i in finally block is--7 6 =============================== 执行顺序: 抛出异常后,执行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和函数的最后都出现。 注意,除此以外的其余作法都是不可行的,编译器会报错
What will be printed when you execute the following code?this
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 (正确)code
A BB
B CBB
C BAB
D None of the aboveorm
初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.而后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 3.其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法; 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法; (1)初始化父类的普通成员变量和代码块,执行 C c = new C(); 输出C (2)super("B"); 表示调用父类的构造方法,不调用父类的无参构造函数,输出B (3) System.out.print("B"); 因此输出CBB
下面代码运行结果是()htm
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语句块
和是:43
B 编译异常
C finally语句块
和是:43
D 和是: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.
往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 类中的私有属性age 3.定义了成员内部类后,必须使用外部类对象来建立内部类对象,而不能直接去 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(); }