</pre>1、继承要注意的几点:属性和方法的不同。<p><span style="color:#ff0000"> 属性不可重写,属性可以覆盖</span></p><p><span style="color:#ff0000"> 属性没有多态性,<strong>属性值取决于引用类型</strong></span></p><p><span style="color:#ff0000"> 方法可以重写,方法有多态性</span></p><p><span style="color:#ff0000"> <strong>方法的行为取决于对象</strong>而不取决于引用类</span></p><p><span style="color:#ff0000"> 生成子类对象必须调用父类构造方法,子类构造方法必须和父类构造方法匹配。</span></p><p>注意上一章:final关键字对属性和对象的修饰效果。</p><p>下面程序代码中a.name与a.fn();分别为属性和对象。继承时有所不同。<span style="color:rgb(255,0,0)">属性值取决于引用类型,<span style="color:rgb(255,0,0)">方法的行为取决于对象。</span></span></p><p></p><pre name="code" class="java"> class A
{
String name="伟哥";
public void fn()
{
System.out.println("A class fn() executing...");
}
}
class B extends A
{
String name="君少";//这样会覆盖A类的name,输出君少。
@Override
public void fn()
{
System.out.println("B class fn() executing...");
}
public static void main(String[] args)
{
B b=new B();
System.out.println(b.name);//输出君少。
A a=new B();//A指向子类对象,并没与打印B类的name属性
//而是打印A类的name,属性没有多态性。
System.out.println(a.name);//属性值取决于引用类型 这里的
//a是对A的引用,所以输出a.name的值。
a.fn();//如果调用的是方法,会体现多态性,打印出B类的fn()
}
}
2、感受下面的代码。
-----------------------------
class A
{
String name="伟哥";
A()
{
System.out.println("A constructor A() is executing...");
}
A(String name)
{
System.out.println("A constructor A(String name)is executing...");
this.name=name;
}
public void fn()
{
System.out.println("A class fn() executing...");
}
}
class B extends A
{
String name="君少";
B()
{
System.out.println("B constructor B() is executing...");
}
B(String name)
{
//super(name);
System.out.println("B constructor B(String name) is executing...");
this.name=name;
}
@Override
public void fn()
{
System.out.println("B class fn() executing...");
}
public static void main(String[] args)
{
A a=new B("王老吉");
System.out.println(a.name);
a.fn();
}
}
输出结果:A constructor A() is executing...//默认执行不带参数的
B constructor B(String name) is executing...
伟哥
B class fn() executing...
注:如果调用A(String name)的话,需要使用super;
super关键字
引用父类对象的属性和方法,调用父类构造方法,必须是构造方法里的第一句。
class A
{
String name="伟哥";
A()
{
System.out.println("A constructor A() is executing...");
}
A(String name)
{
System.out.println("A constructor A(String name)is executing...");
this.name=name;
}
public void fn()
{
System.out.println("A class fn() executing...");
}
}
class B extends A
{
String name="君少";
B()
{
System.out.println("B constructor B() is executing...");
}
B(String name)
{
super(name);//调用父类构造方法;
System.out.println("B constructor B(String name) is executing...");
System.out.println("super(name)..."+super.name);//获得父类的属性
this.name=name;
}
@Override
public void fn()
{
System.out.println("B class fn() executing...");
}
public static void main(String[] args)
{
B a=new B("王老吉");
System.out.println(a.name);
a.fn();
}
}