子类能够继承父类所有的一切,但不能访问父类中private修饰的。
class A{
public int m = 10;
}
class B extends A{
}
public class Demo {
public static void main(String[] args) {
B b = new B();
System.out.println(b.m); //10
}
}
当要执行方法时:
Son son = new Son(); //
son.fun();
if (子类中是否重写了该方法) {
执行子类的方法,变量为子类的变量;
}
else if (该方法未被子类重写) {
执行父类的方法,变量为父类的变量;
}
例子1
class A {
public String str = "a";
public void fun1() {
System.out.println("A-fun1-" + str);
}
public void fun2() {
System.out.println("A-fun2-" + str);
}
public void fun3() {
System.out.println("A-fun3-" + str);
}
public void funA() {
System.out.println("A-funA-" + str);
}
}
class B extends A{
public String str = "b";
public void fun1() {
System.out.println("B-fun1-" + str);
}
public void fun2() {
System.out.println("B-fun2-" + str);
}
public void funB() {
System.out.println("B-funB-" + str);
}
}
class C extends B{
public String str = "c";
public void fun1() {
System.out.println("C-fun1-" + str);
}
public void funC() {
System.out.println("C-funC-" + str);
}
}
public class JavaTest {
public static void main(String[] args) {
B b = new B();
b.fun1(); //B-fun1-b ==>从A中继承fun1(),B重写了fun1()==>执行B中重写的fun1(),变量也为该方法所属类B中的变量
b.fun2(); //B-fun2-b ==>从A中继承fun2(),B重写了fun2()==>执行B中重写的fun2(),变量也为该方法所属类B中的变量
b.fun3(); //A-fun3-a ==>从A中继承fun3(),B未重写fun3()==>执行A中的fun3(),变量也为该方法所属类A中的变量
b.funA(); //A-funA-a ==>从A中继承funA(),B未重写funA()==>执行A中的funA(),变量也为该方法所属类A中的变量
b.funB(); //B-funB-b ==>B中新增的函数==>执行B中的funB(),变量也为该方法所属类B中的变量
// b.funC(); //报错 Cannot resolve method 'funC()' ==>B中不存在funC()
System.out.println("-----------------------");
C c = new C();
c.fun1(); //C-fun1-c ==>B从A中继承fun1(),B重写fun1()==》从B中继承B重写的fun1(),C重写了fun1()==>执行C中重写的fun1(),变量也为该方法所属类C中的变量
c.fun2(); //B-fun2-b ==>B从A中继承fun2(),B重写fun2()==》从B中继承B重写的fun2(),C未重写fun2()==>执行B中重写的fun2(),变量也为该方法所属类B中的变量
c.fun3(); //A-fun3-a ==>B从A中继承fun3(),B未重写fun3()==》从B中继承A的fun3(),C未重写fun3()==>执行A中的fun3(),变量也为该方法所属类A中的变量
c.funA(); //A-funA-a ==>B从A中继承funA(),B未重写funA()==》从B中继承从A的funA(),C未重写funA()==>执行A中的funA(),变量也为该方法所属类A中的变量
c.funB(); //B-funB-b ==>从B中继承B新增的funB(),C未重写funB()==>执行B中重写的funB(),变量也为该方法所属类B中的变量
c.funC(); //C-funC-c ==>C中新增的函数==>执行C中的funC(),变量也为该方法所属类C中的变量
}
}
例子2
class A{
public int m = 10;
public void showM() {
System.out.println(m);
}
public void showM2() {
System.out.println(m);
}
public void test() {
m += 2;
showM2();
}
}
class B extends A{
public int m = 11;
public void showM2() {
System.out.println(m);
}
}
public class JavaTest {
public static void main(String[] args) {
B b = new B();
//==>从A中继承showM(),B未重写showM()==>执行A中的showM(),变量也为该方法所属类A中的变量
b.showM();//10
//==>从A中继承test(),B未重写test()==>执行A中的test(),变量也为该方法所属类A中的变量
// ==>m+=2,这里的m为A的m,执行后A.m=12,b.m=11
// ==>showM2(),从A中继承showM2(),B重写了showM2()==>执行B中的showM2(),变量也为该方法所属类B中的变量
// ==>System.out.println(m),这里的m为B的m,b.m=11
b.test(); //11
}
}