java全栈工程师成功面试宝典-蓝桥给你说说java方法

2017-04-20

26、什么是内部类?静态的内部类和内部类的不同。


内部类指的就是在一个类的内部定义的一个类,在内部类中是不能够定义静态成员,仅仅只是为了寻找一个可以容身之处,所以就需要去放到一个类中而已,这么一点小事,还需要你把它放到类内部的某一个类中,过分了啊!提供内部类,不是为了让你去干这种事情,无聊,不让你干。我想可能是既然静态成员类似c语言的全局变量,而通常内部类是用来创建内部的对象使用的,所以,把“全局变量”放在内部类中本身就是没有意义的一件事情,既然是无意义的一件事情,就应该被禁止,内部类可以直接就去访问外部类中它的成员变量,内部类一般可以定义在外部类的某些方法的外面,同时也可定义在外部类的方法体中,如下所示:


public class Outer

{

int out_x = 0;

public void method()

{

Inner1 inner1 = new Inner1();

public class Inner2 //内部定义的内部类

{

public method()

{

out_x = 3;

}

}

Inner2 inner2 = new Inner2();

}

public class Inner1 //外面定义的内部类

{

}

}


在定义的方法体的外面所定义的内部类的访问类型可以是公共的,受保护的,默认的,私有的等4种类型,这就好像类中所定义的一些成员变量有着4种访问类型是一样的,它们就决定此内部类的定义对其他类是不是可见的;对于这种情况,我们是可以在外面就创建内部类的实例对象时,创建一个内部类的一些实例对象时,就是一定需要先创建外部类的实例对象,然后就用这个外部类的实例对象去创建内部类的实例对象,代码如下:


Outer outer = new Outer();

Outer.Inner1 inner1 = outer.newInnner1();


在方法体内部定义的内部类它的前面是不能有各种访问类型修饰符,这就好像是方法中所定义的局部变量一样,但是这种内部类的前面可以使用final或abstract修饰符。这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。它的这种内部类就必须要是先定义的,然后才使用,就是内部类的所定义的代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也是一样的。这种内部类可以通过访问方法体中的某些局部变量,但是,在这个局部变量之前就必须加上final修饰符。



对于这些细节,只需要你在eclipse写点代码试一试,根据开发工具所提示的各类错误信息,你就可以马上了解到哪段代码出了问题。同时在方法体的内部还可以通过采用如下的语法来创建一种匿名内部类,即在定义某一个接口或者类的子类的同时,并且还创建了这个子类的一些实例对象,却没有必要为这个子类定义名称:


public class Outer

{

public void start()

{

new Thread(

new Runable(){

public void run(){};

}

).start();

}

}


最后,在方法外部定义的内部类前面可以加上static关键字,从而就成为了Static Nested Class,可是它就不再具有内部类本身的特性,所以,从狭义上讲,它不是内部类。静态内部类与普通类在运行时它在行为和功能上并没有什么区别,它只是在编程的引用时的语法上会有一些差别,它可以定义成公共的、受保护的、默认的、私有的等多种类型,而普通类则就只能定义成公共的和默认的这两种类型。


在外面引用静态类的名称为“外部类名.内部类名”。在外面不需要创建外部类的实例对象,就可以直接创建静态内部类,例如,假设内部类是定义在外部类类中的静态内部类,那么可以使用如下语句创建Inner类:


Outer.Inner inner = newOuter.Inner();


由于静态内部类不依赖于外部类的实例对象,所以,静态内部类能访问外部类的非静态成员变量。当在外部类中访问静态内部类时,可以直接使用静态内部类的名字,而不需要加上外部类的名字了,在静态内部类中也可以直接引用外部类的静态的成员变量,不需要加上外部类的名字。



在静态方法中定义的内部类也是静态内部类,这时候不能在类前面加静态关键字,静态方法中的静态内部类与普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的静态的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量前必须加final修饰符。



timg1.jpg




27、内部类可以引用它的包含类的成员吗?有没有什么限制?


完全可以。如果不是静态内部类,那没有什么限制!

如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员,例如,下面的代码:

class Outer

{

static int x;

static class Inner

{

void test()

{

syso(x);

}

}

}


28、Anonymous Inner Class (匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?


可以继承其他类或实现其他接口。不仅是可以,而是必须!


29、super.getClass()方法调用


下面程序的输出结果是多少?

importjava.util.Date;

public classTestextends Date{

public static voidmain(String[] args) {

new Test().test();

}

public void test(){

System.out.println(super.getClass().getName());

}

}

很奇怪,结果是Test

这属于脑筋急转弯的题目,在一个qq群有个网友正好问过这个问题,我觉得挺有趣,就研究了一下,没想到今天还被你面到了,哈哈。

在test方法中,直接调用getClass().getName()方法,返回的是Test类名

由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在

test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。

如果想得到父类的名称,应该用如下代码:

getClass().getSuperClass().getName();


30、String是最基本的数据类型吗?


基本数据类型包括byte、int、char、long、float、double、boolean和short。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类


蓝桥java培训,成就大学生的就业摇篮!

上一篇:Java工程师-8点经验之谈,蓝桥面试官教你把算法写好

下一篇:Java面试过不了?蓝桥面试官帮你整理这几点知识