# ~3 G' N) D9 |) H$ N1 l. ^当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。* K6 n% F% @& H7 F6 f
. W" Q! J# k; y# N9 Ypackage _4_8;: \0 v6 y2 Z0 Y' n
/ V% b1 z; [4 S ^4 G( g# v
class A {% R* U# [+ t2 }# f* m/ q& g
public String show(D obj) {# y9 q4 c ^- [6 {9 F
return ("A and D");) C+ K7 K3 s& c% N9 g g
} 9 M- {4 k' A2 \; Q public String show(A obj) {6 U! W, p3 I [8 B8 r
return ("A and A"); p! j. c! _) l- U, b2 { } 2 ]$ ]& p% C, ^# y! D J1 {
1 v2 Y E/ j2 U' p! E/ }9 J) c# b3 E( j
}! x/ G) L, X% u/ E5 z+ I! D
( p8 i/ I; q" F+ O E ]$ ?' |8 _7 }6 ~1 j9 a
class B extends A{ 8 U. g. ]- Q6 |& x7 r" e //重载! p# u6 V# M8 Z
7 c! i4 F& ]5 q6 U) f& n3 Z
public String show(B obj){+ J# |( I0 Y2 c7 n2 R- m
return ("B and B");4 p9 E! |) \: b9 h) V4 Q
} 4 X, j! r: R! z i% ^9 L //重写 ( V9 C6 S9 n/ { public String show(A obj){4 A5 O2 {7 s) M& R ^
return ("B and A");" ], Z/ s1 K0 m& c4 T. F0 q3 Q
} 1 g) b2 v% Q* x; H9 R5 [, z, ?1 d
" p) a/ Q! p1 ^) i}1 {$ a/ D! G e& I0 j
! ~: B+ V* o3 u1 Z- B) g9 I1 `+ a
0 w2 r+ ?% D/ \- h1 h/ B
class C extends B{} & v! ~) z4 @3 K, I% r* Yclass D extends B{} 4 u8 V9 v B3 K/ ?8 _: Xpublic class t {0 ?4 N- G6 i" u6 T$ f: F" Z
public static void main(String[] args) { + h) Z$ _% D1 v. \; ]- j A a1 = new A(); # N* F& D; k( U/ C. D# b A a2 = new B(); //1.只能调用子类中重写父类的方法,不可以 ; a# O3 G1 k/ q2 U //调用重载的方法8 ~6 h2 y5 s/ @2 |% s, b
B b = new B(); ' [- K5 o3 ~; b4 j2 g C c = new C();& c, O8 W: [$ s2 Q5 n6 e: A! d5 `
D d = new D(); ' m. }' y: W5 [6 {' k- u0 i System.out.println("1--" + a1.show(b));% @$ _5 y1 n6 V O; X! t
System.out.println("2--" + a1.show(c));& A2 C7 D& p7 X- G
System.out.println("3--" + a1.show(d));+ X# C; G/ S! [9 R2 u
System.out.println("--------"); . @. C/ ] c) h' H System.out.println("4--" + a2.show(b));6 I8 A, a, k; b, f' ]
System.out.println("5--" + a2.show(c));! T* i" P7 y% m8 o K. r
System.out.println("6--" + a2.show(d));! p& i0 C1 \1 n' }" \; ? m
System.out.println("6--" + a2.show(a1)); & n2 c* B& c8 q, w System.out.println("*"); ( U K6 j( N8 A! S System.out.println("7--" + b.show(b)); g3 b1 [7 d$ v: _: k8 `$ X System.out.println("8--" + b.show(c)); + |6 A8 ?. B4 W% s+ o- z System.out.println("9--" + b.show(d)); ' D# P! A& K9 Q+ E1 r* T } $ }3 B" S; |3 S w! T- N4 w2 i}' d5 f! o& X" M
OUTPUT: p# W2 C# O% o; t0 m4 ~! k. z
1--A and A # R. B/ t# R& D, j/ m5 a2--A and A ( q0 e2 c+ _# R8 ^3--A and D% R, j) X1 K4 G1 H
--------9 z: c7 x6 H) \$ q5 B
4--B and A3 n- A3 T5 r* }: l1 v
5--B and A5 `8 j4 N' E. u4 u2 \* j( Y- Q
6--A and D. c5 Q$ T0 c) k/ `
6--B and A # k, t# x/ q y4 d0 Q; j0 X. y*2 Z0 X$ s8 \- H3 O1 p% l" p3 h
7--B and B6 W7 H# O2 R' c" Z7 g
8--B and B! y6 A7 d! |; D+ W6 N
9--A and D7 G ^1 M/ E# C( ~+ A
仔细理解一下其中的代码不难理解其中向上转型在继承中的作用。按照this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)这个顺序一步一步的执行就会得到结果。& m9 P/ i0 D. {2 q6 i! Q, |+ w& A( y
& c+ P* H- [ I2 D- o
将子类转换成父类,在继承关系上面是向上移动的,所以一般称之为向上转型。由于向上转型是从一个叫专用类型向较通用类型转换,所以它总是安全的,唯一发生变化的可能就是属性和方法的丢失。 8 I6 i/ v2 `& U3 J# E$ I ) T; n9 B- E& ?继承慎用 : u) k" F5 r8 T' K+ S+ h' X: H9 Q- s" S v2 I" m2 q P! W) M; H
你会感觉当你在编写三四个程序的时候用继承解决了他们公共的部分是很方便的,但是如果你程序很大,class很多而且都继承于一个类中,当你想通过改变父类的一些信息来改变一个子类的信息的时候就会发现其他的子类也会随之改变,有时候会对其他的子类产生不必要的结果。+ l6 R! a1 Q3 Z( Q! O c3 t/ Q
. t. {2 Q1 c5 V
父类变了其他的子类就会随之全部改变。 . Q) D9 w5 d9 k; d: [* i - i# C( M5 V" E& p: Z继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。" A# [6 ~4 t5 u5 C3 k
, h1 ^: W3 @! g3 |) A- V: l继承是一种强耦合关系。+ X, J6 E E) p" b
2 @+ \9 g( ?$ r2 P0 \7 U! c
“问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承”——《Think in Java》 0 d3 I. J6 E- |5 @' n
2 Z+ a4 U6 x, u X后言1 F N/ n) d! d+ T2 ~. U
# Z2 h d% k5 }0 p* D3 _( ~这些都是自己翻阅资料或者是查看其他大佬的blog总结的,如有侵权请告知!!!如有错误请指出,谢谢。. _* w8 q5 [- Y1 W: b' s
. u+ m% S: O2 Z
希望对你们有所帮助,本人也正在学习Java的路上也是小白一枚,还需要大佬们的多多支持。& c! P \# w, u( |% E/ B2 w
' D4 }; T B' ~: Z% A+ C- Q8 S l9 l9 q1 X$ j8 U T g8 R$ c
———————————————— 4 _4 P( w/ ?/ ]; k4 C `4 @ m Y2 H版权声明:本文为CSDN博主「YYH-ZC」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 S; z! R& r3 B' P5 |
原文链接:https://blog.csdn.net/weixin_45629315/article/details/105876883; }5 n W6 a5 D E! V