您现在的位置是: 首页 > 个人博客 > 据说是一道华为Java面试题 个人博客
据说是一道华为Java面试题
2018-12-26 11:12:31
【问答】2077人已围观
简介 请问下面程序将会输出什么?程序如下:public class Test { class A{ private static final int m = 10; public A(){ change(); } public void change(){ System.ou......
请问下面程序将会输出什么?程序如下:
public class Test {
class A{
private static final int m = 10;
public A(){
change();
}
public void change(){
System.out.println(m);
}
}
class B extends A{
private static final int num = 20;
public void change(){
System.out.println(num);
}
}
}输出测试:
public class Test2 {
public static void main(String[] args) {
new Test().new B();
}
}结果公布,最终会输出:20,为什么?分析一下继承的初始化顺序。
继承的初始化顺序一般如下:
父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类的非静态变量(子类的非静态代码块)-->子类的构造函数
值得注意的是:父类的非静态变量(父类的非静态代码块)是同一级的,看哪个部分写在类的最前面谁就先被执行,子类的非静态变量(子类的非静态代码块)也是一样。
所以这道题,实例化一个子类,首先会去执行父类的构造方法,执行构造方法中的函数change,但是由于change函数被子类重写了,所以执行的将是子类的change,所以会输出20;
但是,如果我们把子类的中的
private static final int num = 20;
改为
private int m = 20;
那么结果又会输出什么呢?结果是0,因为在父类的构造方法中调用子类的change方法输出num的时候,num作为一个实例变量,这时候还没有被实例化赋值,所以取得是初始值0。
上一篇: 有趣的Java字符串
相关文章
随机图文
大家猜一猜运算结果?
大家决定下面这段代码的运算结果是什么呢?public class Test { public static void main(String[] args) { int n = getNum(); System.out.println(n); } public static int getNum(){ int a = 10; try { a = 20; throw new RuntimeException(); } catch (Exception e) { a = 30; return a; }finally{ a = 40; } }}略微思考,大家都应该知道结果,是30,分析一下:首先,初始化变量a的值为10,继续执行,重新将a赋值为20,这时抛了一个异常,被catch捕获,这是a再次被重新赋值为30,这时候看到了return关键字,程序保存方法返回值(这个返回值将作为最后的运行结果,返回给外部调用),最后执行finally,执行完之后,再把前面运行得到的结果返回给程序调用。
关于Access denied问题的解决办法
再启动javaweb项目的时候,我们不经意间会遇到一个如下问题:造成这种问题的原因有很多种,比如,账户密码错误,或者数据库权限设置问题。首先确认自己项目配置文件的数据库名和密码是否配置正确,这个原因也可能导致。如果配置文件中你的数据库账户和密码确认无误,但依然出现以上错误,请按照如下步骤操作:1.登录mysql cd D:\mysql-5.6.24-win32.1432006610\mysql-5.6.24-win32\bin mysql -u root -p 输入你的数据库密码,按enter确定登录。 2.修改数据库密码 切换到mysql自带库:use mysql; 如果你的mysql版本是5.7以下(不包括5.7),请使用如下sql命令修改密码: update user set Password = password ('123456') where User = 'root'; 如果你的mysql版本是5.7及以上,请使用如下sql命令修改密码: update user set authentication_string=password('123456') where user='root';3.刷新权限 flush privileges;4.退出数据库 quit;5.重启数据库 net stop mysql net start mysq具体演示操作如下:最后在使用navicat for mysql测试一下是否可以登录。如果可以,在eclipse重启项目,使用浏览器访问页面,如果不在报错,那么恭喜你,问题解决了。如果你不记得你的数据库密码了,你可以通过在数据库安装目录bin下,添加配置skip-grant-tables添加这个配置的作用是为了使用cmd控制台登录数据库时,跳过密码验证,不必输入密码,直接enter即可进入数据库。然后重启mysql服务器。
有趣的Java字符串
先上代码:public class Test3 { public static void main(String[] args) { String str = 1+1+"1"; String str_ = "1"+1+1; System.out.println("str:"+str); System.out.println("str_:"+str_); }}程序输出:str:21str_:111可以看到,如果运算在字符串的前面,那么会先执行运算,再讲运算结果与字符串拼接;如果运算在字符串的后面,那么运算将变得毫无意义。^_^大家可以去试试。
据说是一道华为Java面试题
请问下面程序将会输出什么?程序如下:public class Test { class A{ private static final int m = 10; public A(){ change(); } public void change(){ System.out.println(m); } } class B extends A{ private static final int num = 20; public void change(){ System.out.println(num); } }}输出测试:public class Test2 { public static void main(String[] args) { new Test().new B(); }}结果公布,最终会输出:20,为什么?分析一下继承的初始化顺序。继承的初始化顺序一般如下:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类的非静态变量(子类的非静态代码块)-->子类的构造函数值得注意的是:父类的非静态变量(父类的非静态代码块)是同一级的,看哪个部分写在类的最前面谁就先被执行,子类的非静态变量(子类的非静态代码块)也是一样。所以这道题,实例化一个子类,首先会去执行父类的构造方法,执行构造方法中的函数change,但是由于change函数被子类重写了,所以执行的将是子类的change,所以会输出20;但是,如果我们把子类的中的private static final int num = 20;改为private int m = 20;那么结果又会输出什么呢?结果是0,因为在父类的构造方法中调用子类的change方法输出num的时候,num作为一个实例变量,这时候还没有被实例化赋值,所以取得是初始值0。
点击排行
javaweb+mysql项目部署教程
点赞排行
javaweb+mysql项目部署教程