一、继承:
1、语法:class 类型 extends 父类名{ }
2、java中继承只能单继承
3、B类继承A类:
A类称作父类,基类,超类,superclass
B类称作子类,派生类,subclass
4、子类继承父类会将父类中所有的数据全部继承,包括私有的也会继承,构造方法除外
5、私有的数据继承之后,虽然在子类中没有办法直接访问,可以间接访问。
6、继承最基本的作用是:代码重用。最重要的作用是:方法覆盖和多态。
package com.JavaStudy.study0427; public class Animal { private String name; Animal(){} public void setName(String name){ this.name = name; } public String getName() { return name; } public void move( ){ System.out.println(getName()+" is moving!"); } }
package com.JavaStudy.study0427; public class Fly extends Animal { Animal animal = new Animal(); public void fly(){ animal.setName("小燕子"); System.out.println(animal.getName()+" is flying !"); } }
package com.JavaStudy.study0427; public class Test { public static void main(String[] args){ Fly fly = new Fly(); //fly对象调用自己类的方法 fly.fly(); //Fly继承了Animal类,所以可以用fly的对象给Animal类的name赋值,同样也可以调用Animal类的moving() //子类不能直接访问父类的私有数据,但是可以通过set这样的间接方式访问 fly.setName("小兔子"); // fly.move(); } }
二、super关键字
1、super不是引用类型,不保存内存地址,不指向任何对象
2、父类中有这个数据,结果子类中也有这个数据,非要在子类中访问父类中的那个数据,必须使用”super.“,除该情况外,其他程序都不需要加“super.”
3、super本质只是一个普通的关键字而已,是代表当前子类对象中的“父类型特征”
4、“super.”语法不能用在静态方法中,“super.”可以使用在成员方法中。super仅代表父类型
package com.JavaStudy.study0427; public class SuperDemo01 { public static void main(String[] args){ Manager m = new Manager(); m.test(); System.out.println(m); } } class Employee{ String name = "TOM"; public void work(){ System.out.println("Employee类中的work方法!"); } } class Manager extends Employee{ String name ="jeck"; public void test(){ work();//自己类中的work方法 this.work();//this是一个引用指向自己,所以是子类的work super.work();//super不是一个引用,用的是父类的work方法 System.out.println(name); System.out.println(this.name);//this是一个引用指向自己,所以是子类的name属性 System.out.println(super.name);//super不是引用,用的是父类中的属性 System.out.println(this);//打印this所保存的内存地址,来验证this是自己指向自己 } public void work(){ System.out.println("Manager子类中的work方法!"); } } ====执行结果==== Manager子类中的work方法! Manager子类中的work方法! Employee类中的work方法! jeck jeck TOM com.JavaStudy.study0427.Manager@2503dbd3 com.JavaStudy.study0427.Manager@2503dbd3
三、super()
this适用于本类,super适用于多个类
this(实参):
通过一个构造方法去调用另外一个构造方法
目的是代码重用
只能出现在构造方法的第一行
super(实参):
通过子类的构造方法调用父类的构造方法
目的:通过子类的构造方法调用父类的构造方法,目的是给当前子类对象中的父类型特征赋值
只能出现在构造方法的第一行
this(实参);和super(实参);不能共存
注意:虽然super(实参);执行了,但是并不会创建父类对象
子类中的构造方法要执行,那么必须先执行父类中的构造方法。(先有父后有子)
如果一个构造方法第一行没有显示写“super(实参);”或者“this(实参)”,系统会默认加一个super()
Java中只要创建一个Java对象,则Java.lang.Object;中的无参数构造方法一定会执行。
package com.JavaStudy.study0427; // 子类给父类赋值,用到super() //Account默认情况下继承了Object类,一般不写 class Account extends Object{ private String actno; private String balance; public void setActno(String actno){ this.actno = actno; } public String getActno() { return actno; } public void setBalance(String balance){ this.balance = balance; } public String getBalance(){ return balance; } Account(){ super();//调用了父类Object actno = "工行"; balance = "货币"; } Account(String actno,String balance){ this.actno = actno; this.balance = balance; } } class DebitAccount extends Account{ private String debit; public void setDebit(String debit){ this.debit = debit; } public String getDebit() { return debit; } DebitAccount(){ super();//调用了父类的缺省构造器 debit = "信用"; } DebitAccount(String actno,String balance,String debit){ super(actno,balance);//调用了父类有两个参数的构造方法,目的是给父类赋值 this.debit = debit; } } public class SuperDemo02 { public static void main(String[] args){ DebitAccount d1 = new DebitAccount(); System.out.println(d1.getActno()); System.out.println(d1.getBalance()); System.out.println(d1.getDebit()); System.out.println("--------------------"); DebitAccount d2 = new DebitAccount("招行","基金","征信"); System.out.println(d2.getActno()); System.out.println(d2.getBalance()); System.out.println(d2.getDebit()); } } ===执行结果=== 工行 货币 信用 -------------------- 招行 基金 征信