「java的问题解析」有关java的问题及答案
今天给各位分享java的问题解析的知识,其中也会对有关java的问题及答案进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
求解此Java题解析?怎么看?
这个问题考的是Java的继承和多态性。以下语句
A b = new B();
在执行的时候,同名变量是基类A的变量覆盖派生类B的变量,会类B方法会覆盖同名同参数的类A方法。所以以上语句执行A的赋值,B的f函数(同名重写)。
学习编程最好的方法是实验。可以用以下代码测试:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package testjava;
/**
*
* @author tomheaven
*/
public class TestJava {
static class A {
int a = 10;
int c;
int d;
public A() {
c = 10;
d = 10;
}
int f(int x, int y) {
return x + y;
}
}
static class B extends A {
int a = 5;
int c;
public B(int input) {
c = input;
d = input;
}
int f(int x, int y) {
return x * y;
}
void f2() {
System.out.println("I'm B!");
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//B b = new B();
A b = new B(20);
System.out.println(b.c);
System.out.println(b.d);
//b.f2();
// B.class.cast(b).f2();
System.out.print(b.a + ",");
System.out.println(b.f(3, 5));
System.out.println(b.toString());
}
}
}
运行结果就不说了。需要注意的是,当b属于类A的时候:
无法调用f2函数。这说明了基类对象不能调用派生类函数(除非通过cast方法强制转换为派生类对象)。
c的值为10。这说明同名变量A中最终保存的基类A的构造函数的结果。
d的值为20。这说明B的构造函数得到了执行,而A的没有执行或者被覆盖了。
JAVA程序问题,求详解
/**
* 此方法使用的是数组处理,没有使用动态数组,如果有需要,去看看:System.arraycopy
*
* @return
*/
public int[] fn1() {
int[] oldArr = {1,3,5,7,9,1,5,4,0};
//因为java里,数组是定长,那么新数组现在是不知道要多长的,那么遍历一遍看看有多少个1
int c = 0;
for(int i = 0; ioldArr.length; i++) {
if(oldArr[i]==1) {
c++;
}
}
int[] newArr = new int[c];
//定义好新数组后,给它赋值,把不等于1的给它
c = 0;
for(int i = 0; ioldArr.length; i++) {
if(oldArr[i]!=1) {
newArr[c++] = oldArr[i];
}
}
return newArr;
}
/**
* 此处用的是list的动态长度,因为使用到泛型,所以只能用包装类
*
* @return
*/
public Integer[] fn2() {
Integer[] oldArr = {1,3,5,7,9,1,5,4,0};
ListInteger oldList = Arrays.asList(oldArr);
ListInteger newList = new ArrayList();
oldList.forEach(i-{
if(i!=1) {
newList.add(i);
}
});
return newList.toArray(new Integer[0]);
}
Java Swing多线程死锁问题解析
在基于Java Swing进行图形界面开发的时候 经常遇到的就是Swing多线程问题 我们可以想想一下 如果需要在一个图形界面上显示很多数据 这些数据是经过长时间 复杂的查询和运算得到的 如果在图形界面的同一个线程中进行查询和运算工作则会导致一段时间界面处于死机状态 这会给用户带来不良的互动感受 为了解决这个问题 一般会单独启动一个线程进行运算和查询工作 并随时更新图形界面 这时候 另一个问题就出现了 可能不仅没有解决原来偶尔死机问题 还可能导致程序彻底死掉 幸运的是在JDK中暗藏了一个中断程序的快捷键 就是CTRL+BREAK 这个快捷键Sun并没有在文档中公布 如果在命令行模式下启动Java程序 然后按CTRL+BREAK键 会得到堆栈的跟踪信息 从这些跟踪信息中就可以知道具体引发死机的位置了
当一个程序产生死锁的时候 你一定会希望尽快找到原因并且解决它 这时候 你一般的精力会用在查找引发死锁的位置 另一半的精力会用于对堆栈进行跟踪一确定引发死锁的原因 但是在Java Swing程序中 你的所有努力可能都是没有价值的 这是因为Java对Swing的多线程编程有一个特殊要求 就是在Swing里 只能在与Swing相同的线程里对GUI元件进行修改
也就是说 如果你要执行类似于jLabel setText( blabla )代码 必须在Swing线程中 而不允许在其他线程当中 如果必须在其他线程中修改元件 可以使用类似一下方式解决
SwingUtilities invokeLater(new Runnable() {
public void run() {
jLabel setText( blabla );
}
}
invokeLater方法虽然表面有时间延迟执行含义 但是实际上几乎没有任何影响 可能在几毫秒之内就会被执行 另外还有一个invokeAndWait方法 除非特殊需要 否则几乎是不用的
在不使用invokeLater的情况下 导致刷新问题是可以理解的 但是导致死锁就优点令人匪夷所思了 幸运的是 不是任何时候都需要调用改方法 这是因为大多数情况下 我们都是在与Swing同一个线程里进行界面更新 例如监听按钮点击事件的ActionListener actionPerformed方法就是运行在与Swing相同的线程中的 但是如果在回调类中引用了另一个类 并且是不属于AWT/Swing的 那么结果就很难确定了 所以说使用invokeLater应该是最安全的
需要注意的是 在invokeLater做的任何事情 都会导致Swing线程窗口绘制工作暂停下来 等候invokeLater工作结束 所以不要在invokeLater进行耗时操作 尽量只执行那些界面绘制相关的工作 可以通过代码重构 将那些与界面更新相关的代码集中起来统一处理
lishixinzhi/Article/program/Java/gj/201311/27498
java的问题解析的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于有关java的问题及答案、java的问题解析的信息别忘了在本站进行查找喔。