package test0905;
/*
* 1、什么是继承?
* 通过一个现存的类去扩展生成(派生)一个新类。将现存类称之为父类,新类称之为子类。
*
* 2、如何实例继承? 继承的格式是什么?
* 通过关键字 extends 来实现。
* 格式如下:
* public class 子类名 extends 父类名 { ...... }
*
* 3、理解为什么需要继承? 继承有何好处?
* 思考:
* 学生 与 人 之间的关系
*
* 结论: 学生是一个人,也是一个特殊身份的人。因此,学生由人发展而来。
*
* 类与类之间的关系有三种:
* 1) 依赖关系。
* 2) 聚合关系(整体与部分)。
* 3) 继承关系( is a )
*
* 继承好处:
* 1) 提高了子类生成的效率。即:提高了开发的效率。
* 2) 极大地提高了父类代码的重用性。
*
* 4、方法的重写(方法的覆盖)?
* 它指的是:在子类中,对继承自父类的某个方法或某几个方法不满意(当前业务需求发生变化)。
* 因此,为了适应当前业务的需求,在子类中对这个方法或这几个方法进行重写(改变方法体)所
* 生成的方法称之为方法的重写。
*
* 注意: 一般情况下,在重写方法时,只改变方法体。
* 然而,从java5.0及以上版本新增一个特性:
* 在重写方法时,可以改变方法返回值的类型。但,改变后的类型必须是原类型的子类型。
*
* 因此,发现,当方法的返回值的类型是基本类型时,则不可变。
* 5、在java语言中,规定: 继承只支持单继承,不支持多继承。
* 即: 一个类只有一个父类,不可以有多个父类。
*
* 还规定: 一个类可以实现多继承的功能,通过接口来实现。
* 也就是说: 一个类有一个父类,也可以有多个干父亲(实现多个接口)。
*
* 即: public class 子类 extends 父类1 , 父类2 { ...... } //error
* 即: public class 子类 extends 父类 implements 接口1(干父亲1) , 接口2(干父亲2), ... { .... }
*
* 6、父类中的构造器和私有的方法是不可被继承的。
*
* 7、java语言规定: 在子类的构造器中会自动调用父类的默认构造器。
* 通过 super()来表示调用父类的默认构造器。
*
* 然而,当子类中的构造器人为调用了其它构造器时,则它就不会调用父类的默认构造器。
* 8、java中的特殊关键字 super。
* a) 当它以 " super. " 方式出现时,它代表父类。 *
* b) 当它以 " super() 或 super(参数列表) " 方式出现时,
* 它代表父类的默认构造器或带相应参数的构造器.
*
* 注意事项:
* a) super.方法; 通常是子类中重写方法时使用,表示在方法体中调用父类的原方法。
* b) super() 或 super(参数列表) ; 在子类的构造器出现,且必须是第一个行。
* c) this可以代表对象,但 super不可以代表对象。
* d) super也不可在静态方法中使用。
* 9、寻根:
* 在Java语言中,存在一个超根类: Object 类。
* 即: Object类是所有类的祖先。
* 因此一个类在生成时,若没有明确通过extends 关键字指明它的父类,系统会自动将
* Object类作为它的父类。
* 例如: public class Person { ... }
* 相当于 public class Person extends Object {......}
* Object类提供几个常用的方法:
* String toString(); 它用来以字符串方式反馈对象的信息,它是默认调用的。
*
* boolean equals(Object obj); 用来比较两个对象是否相等。
* 使用方式: obj1.equals(obj2);
* 祖先规定:当obj1和obj2引用的是同一个对象时,则反馈true;反之,则反馈false。
*
* int hashCode(); 用来反馈对象的哈希编码值(后述)。
*
* 注意: 一个字串就是一个对象。另外,字符串在计算机内存是共享的。
*
* 结论1: 自定义类的对象要判断相等,则必须在该类中重写 equals()方法,为对象比较相等提供条件。
*
* 凡是对象比较相等应用 equals()方法。
* 凡是基本类型的数据比较相等就用 ==
*
* 注意: 当对象用 == 去比较相等时,则比较的是对象的地址。
*
* 结论2: 当需要通过对象变量直接获取对象信息并打印在屏幕上时,则该自定义类中必须重写toString()方法。
*
* 建议: 在封装一个类(新建一个类)时,往往重写equals() 和 toString() 两个方法。
*/
public class ExtendsTest {
public static void main(String[] args) {
Student st1 = new Student();
st1.setId(201416001);
st1.setName("张三"); //继承自父类的方法
st1.setAge(21 );//继承自父类的方法。
st1.setSchool("尚学堂");
System.out.println( st1 );
//根据运行后的结果,发现:学生的性别产随机产生的。因此,学生类的构造器与父类的构造器之间存在某个默认的关联。
System.out.println(st1.getName() + " 同学,你帮我做一道算术题,行吗?");
System.out.println("没问题,把数据给我就行了。");
int a = (int)(89898 * Math.random());
int b = (int)(31413 * Math.random());
int re = st1.add(a, b); //此方法是从父类中继承而来。
System.out.println( re );
}
}
/* 最终的实例变量
* 1) 最终实例变量必须用 final 关键字修饰。
* 2) 最终实例变量在声明后一旦赋值,则不可改变; 即 最终实例变量只能被初始化一次;
* 3) 在声明最终实例变量时若没有赋值,则必须在每一个构造器中进行初始化。
* 4) 最终实例变量不可有设定器。
*/
class Person {
private String name;
private final boolean SEX; //定义性别为最终属性;在java中一般用大写字母表示最终属性;
private int age;
public Person() {
int n = (int)(2 * Math.random()); //实现最终属性SEX的初始化;
this.SEX = (n == 1);
}
public Person(String name,boolean sex, int age) {
this.name = name;
this.SEX = sex;
this.age = age;
}
//设定器
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
//访问器
public String getName() {
return name;
}
public boolean isSEX() {
return SEX;
}
public int getAge() {
return age;
}
//功能方法
public int add( int x,int y ){
return x + y;
}
}
class Student extends Person { //extends 关键字表明 Student 类由 Person类扩展而来(称之为继承)。
//在子类中只需要将子类的个性描述出来,而共性由父类继承而来。
private int id;
private String school;
public Student() {
super(); // 它代表父类的默认构造器,是自动存在的
}
public Student( int id, String school ){
this.id = id;
this.school = school;
}
public void setId(int id) {
this.id = id;
}
public void setSchool(String school) {
this.school = school;
}
public int getId() {
return id;
}
public String getSchool() {
return school;
}
//将学生的信息以字符串方式反馈
public String toString(){
//以下调用的方法均来自父类,体现了继承性。
return "学号: " + id + " 姓名: " + this.getName() + " 性别: "
+ (this.isSEX() ? "男":"女") + " 年龄: " + this.getAge()
+ " 学校: " + school;
}
/* 方法的重写:在子类中,对继承自父类的方法进行改变其方法体。
public int add(int x, int y) {
System.out.print( x + " + " + y + " = " );
return x + y;
}
*/
}
笔记12 继承extends
最新推荐文章于 2024-12-31 17:15:03 发布