1.写出程序运行结果
public class TestString {
public static void link(String a){
a+= "World";
}
public static void main(String []args){
String a = "Hello";
link(a);
System.out.println(a);
}
}
1). String对象的内容是不能改变的,a+="World"并不是把a所指对象改变,
而是先生成一个临时String对象,其值为a+"World",然后在把这个临时
对象赋给a.
2). Java中函数参数传递方式为Call by value,link方法中会生产a的一个
拷贝,同样指向a所指的对象,综合以上两点,得出结果为 Hello
2. 写出下面代码的结果
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
答:"=="用来比较对象的引用,而equals()用来比较对象的内容,但是如果是字符串常量,用"=="也可以比较内容
是否相等,"ja"+"va"和"java"都是字符串常量,因此结果为true
同理,下面代码结果也是true
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
3.继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
public
class Parent {
//1
static int a = 1;
//2
static
{
a=10;
System.out.println( "parent static code");
}
//4
public Parent(){
System.out.println( "Parent constructor");
System.out.println( "Parent a ="+a);
}
public static void main(String []args){
System.out.println( "*****************");
Parent c = new Child();
}
}
public class Child extends Parent{
static int a = 2;
//3
static {
a=20;
System.out.println( "child static code");
}
public Child(){
System.out.println( "Child constructor");
System.out.println( "Child var a="+a);
}
}
//1
static int a = 1;
//2
static
{
a=10;
System.out.println( "parent static code");
}
//4
public Parent(){
System.out.println( "Parent constructor");
System.out.println( "Parent a ="+a);
}
public static void main(String []args){
System.out.println( "*****************");
Parent c = new Child();
}
}
public class Child extends Parent{
static int a = 2;
//3
static {
a=20;
System.out.println( "child static code");
}
public Child(){
System.out.println( "Child constructor");
System.out.println( "Child var a="+a);
}
}
输出结果:
parent
static code
*****************
child static code
Parent constructor
Parent a =10
Child constructor
Child var a=20
*****************
child static code
Parent constructor
Parent a =10
Child constructor
Child var a=20
由此可看出在还没有实例化类的时候(注意*号)已经执行了static代码块。顺序是先父类后子类.然后才调用父类的构造方法,再调用子类的构造方法.就是这个顺序了.
4.内部类的实现方式:
public
class OuterClass {
static int a;
int b;
private class InnerClass{
public InnerClass(){
System.out.println( "InnerClass create:"+a);
}
}
public OuterClass(){
InnerClass ic = new InnerClass();
System.out.println( "OuterClass create");
}
public static void main(String []args){
OuterClass oc = new OuterClass();
}
}
static int a;
int b;
private class InnerClass{
public InnerClass(){
System.out.println( "InnerClass create:"+a);
}
}
public OuterClass(){
InnerClass ic = new InnerClass();
System.out.println( "OuterClass create");
}
public static void main(String []args){
OuterClass oc = new OuterClass();
}
}
总结:
一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;
三.非静态内部类的非静态成员可以访问外部类的非静态变量
一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;
三.非静态内部类的非静态成员可以访问外部类的非静态变量
5. Float类型
public
class TestFloat {
public static void main(String []args){
Float a = new Float(3.4);
System.out.println(a.SIZE);
a = new Float(34000);
System.out.println(a.SIZE);
}
}
public static void main(String []args){
Float a = new Float(3.4);
System.out.println(a.SIZE);
a = new Float(34000);
System.out.println(a.SIZE);
}
}
让我们来看看此程序会输出什么呢?
我们先来看看JDK的解释吧.
我们先来看看JDK的解释吧.
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
意思是说:通常去描述一个float值的位数.
这个是一个常量,来看看源码吧:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
final int 变量一旦被定义就不能被改变~
第二个Float类型题:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
其实是不能的。
原因是精度问题,应该用强制类型转换.
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
再来看看这个能不能编译通过
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
我们来看看Float类的源代码吧:
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
其中有一个构造方法在方法里已经进行了向下转型。
所以这样写是没有问题的.
6.选出用法错误的:
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
7.此程序会输出什么?
public
class A {
//3
public A(){
a1();
}
public void a1(){
System.out.println( "A-a1");
}
}
//3
public A(){
a1();
}
public void a1(){
System.out.println( "A-a1");
}
}
public
class B
extends A{
int bb = 0;
//2
public B(){
//5
bb=1000;
}
//4
public void a1(){
System.out.println( "bb is"+bb);
System.out.println( "B-a1");
}
public static void main(String []args){
new B();
}
}
int bb = 0;
//2
public B(){
//5
bb=1000;
}
//4
public void a1(){
System.out.println( "bb is"+bb);
System.out.println( "B-a1");
}
public static void main(String []args){
new B();
}
}
答案:
bb is 0
B-a1
看看执行顺序就明白了.
在方法被a1()被重写的情况下,父类的a1是没有机会
被调用的.
bb is 0
B-a1
看看执行顺序就明白了.
在方法被a1()被重写的情况下,父类的a1是没有机会
被调用的.
转载于:https://blog.51cto.com/tscjsj/85891