笔记12 继承extends

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;
	}
*/
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值