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.0System.out.println(b.f(3.0, 5.0)); // 8.0A a = new A();System.out.println(a.getNumber(10));// 11a = new B();// 原因为A的引用,B的对象,A的引用a指向B对象,此时的a只会拥有A的方法,但是如果B中有方法覆盖了A的方法,则会使用B的方法System.out.println(a.getNumber(10));// 110System.out.println(b.f(10.0, 8.0)); // 18.0System.out.println(b.g(3));// 12a = new B();// 原因为A的引用,B的对象,A的引用a指向B对象,此时的a只会拥有A的方法,但是如果B中有方法覆盖了A的方法,则会使用B的方法System.out.println(a.f(10.0, 8.0)); // 18.0System.out.println(a.g(3));// 9b.m = 20;System.out.println(b.getM());// 120A a1 = b;// a1指向对象ba1.m = -100;// a1变量赋值-100System.out.println(a1.getM());// 120: a1.getM()==>实质上已经被b的getM覆盖,且此时用的是b的变量100,调用之后结果为20+100 = 120System.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();}
取消
评论