static 是静态声明,所以会先执行Employee.id的时候,会先执行static的脚本,就是id 的默认赋值和静态块的执行,即打印那个static_block
创新互联致力于互联网网站建设与网站营销,提供成都做网站、成都网站建设、网站开发、seo优化、网站排名、互联网营销、微信小程序、公众号商城、等建站开发,创新互联网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。
所以流程是。赋值id,打印static_block;那上面的代码就是打印static_block 和Main:0
class A {
double f(double x, double y) {
return x + y;
}
int getNumber(int a) {
return a + 1;
}
static int g(int n) {
return n * n;
}
int m;
int getM() {
return m;
}
int seeM(){return m;}
}
class B extends A {
double f(int x, int y) {
return x * y;
}
int getNumber(int a) {
return a + 100;
}
int xx() {
return 11;
}
static int g(int n) {
int m = A.g(n);
return m + n;
}
int m;
int getM() {
return m + 100;
}
}
class E {
public static void main(String[] args) {
B b = new B();
System.out.println(b.f(3, 5));// 15.0
System.out.println(b.f(3.0, 5.0)); // 8.0
A a = new A();
System.out.println(a.getNumber(10));// 11
a = new B();// 原因为A的引用,B的对象,A的引用a指向B对象,此时的a只会拥有A的方法,但是如果B中有方法覆盖了A的方法,则会使用B的方法
System.out.println(a.getNumber(10));// 110
System.out.println(b.f(10.0, 8.0)); // 18.0
System.out.println(b.g(3));// 12
a = new B();// 原因为A的引用,B的对象,A的引用a指向B对象,此时的a只会拥有A的方法,但是如果B中有方法覆盖了A的方法,则会使用B的方法
System.out.println(a.f(10.0, 8.0)); // 18.0
System.out.println(a.g(3));// 9
b.m = 20;
System.out.println(b.getM());// 120
A a1 = b;// a1指向对象b
a1.m = -100;// a1变量赋值-100
System.out.println(a1.getM());// 120: a1.getM()==实质上已经被b的getM覆盖,且此时用的是b的变量100,调用之后结果为20+100 = 120
System.out.println(b.seeM());// -100: b的seeM()来自父类A,当然会调用父类的A.m=-100,所以此时结果为-100
}
}
class Father {
private int money = 12;
float height;
int seeMoney(){return money;}
}
class Son extends Father {
int height;
int lookMoney() {
int m = seeMoney();
return m;
}
}
class EE {
public static void main(String[] args) {
Son erzi = new Son();
// erzi.money = 300;// 错误原因在Son没有money这一属性,什么样的引用对应什么样的变量和方法
// erzi.height = 1.78F;// 类型错误
}
}
abstract class XX {
// 只能设置可视性修饰符“公用”或“受保护”中的一个
public static void cry(){}
abstract float cry1();
}
这种问题有个很简单的方法,用单步跟踪。
Eclipse等主流IDE均支持。
许多时候,我们必须依赖一些工具了
没有反应是什么意思,你的提示信息都是控制台输出,控制台才看的见吧
很好理解的啊?打印出来的字符串不用我说了吧?比如CALL SECOND之类的,因为这个执行在前啊?
其他的我就选一个讲下吧:比如
System.out.println("c2==c3:"+(c2==c3)); 结果是: c2==c3:false
对吧,前面输出的是字符串,也就是冒号内的“c2==c3:”,后面是c2和c3的比较结果,==是逻辑操作符,如果两个变量相等则返回true,负责返回false,这就解释了false。
程序中if语句后带了分号,导致if条件成立时的执行语句为空,需要去掉分号:
if(arr[x] arr[max]){
max = x;
}
和
if(arr[x] arr[min]){
min = x;
}
PS:即便if语句执行体只有一句话,最好也加上大括号,这是个好习惯。