您的位置:首页 > 编程语言 > Java开发

20150903 Java学习笔记之继承性

2015-09-03 21:33 267 查看

1.继承性

下面写一个父类,一个子类

package com.buaa.day3;

public class Person {

private String name ;
private int age ;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

}


package com.buaa.day3;
/* 继承的主要目的是功能的扩充,以下代码既有 维持 又有扩充,在Java只有一个直接父类,要想实现多继承,可以用多层继承的方式,
* 但是从开发来讲,多层继承不建议超过三层关系,因为层次太多必然会导致信息传递的不畅。
* 在子类继承父类的时候,实际上那个子类会继承父类之中的全部操作,对于所有的非私有操作属于显示继承,显示继承可以直接进行操作,而所有的私有操作属于隐式继承,隐式继承需要引用getter,setter方法。
* 在子类对象实例化的第一步一定会默认调用父类中的无参构造方法,为父类中的属性初始化,而后再调用子类的构造方法。为子类中的属性初始化。
* 那么就相当于在子类的方法中隐含了一个super() 调用的语句,但是如果父类之中没有无参构造方法了,子类将无法继承父类的无参构造方法,而只要子类进行对象实例化,就必须调用父类的构造方法,
* 解决办法一:如果只想调用父类的无参构造方法,那么在编写类的是保证存在无参构造方法。解决办法二:如果想调用父类的指定的有参构造方法
* 那么必须使用super(参数,参数,...),此时在子类对象实例化之前算是调用了父类的有参构造方法。*/
public class student  extends Person{
private String school;

public String getSchool() {
return school;
}

public void setSchool(String school) {
this.school = school;
}
public student (){System.out.println("student类的无参构造方法");}
public student(int age,String name,int sal, String school){
//super();//调用父类的无参构造方法,一定要放放在子类构造方法的首行
super(age,sal);//调用指定的构造方法
System.out.println("student类的有参构造方法");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//student student = new student();
student student = new student(23,"zhangsan",30,"beihang");
student.setName("zhangsan");
student.setAge(30);
student.setSchool("北京航空航天大学");
student.sal =30;
Person.job ="高级软件工程师";
System.out.println("name:"+student.getName()+",age:"+student.getAge()
+",school:"+student.getSchool()+"salary:"+student.sal+",Job:"+Person.job);

}

}


2.重写父类的方法

方法的重写遵循:两同两小一大。两同:方法名,形参类型及个数相同,返回值类型;两小:子类方法返回值类型应比父类方法返回值类型更小或者相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;一大:子类方法的访问权限应比父类方法的访问权限更大或相等。

覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法重写只会是方法的重写,但是属性并不会被覆盖。如果子类覆盖了父类的方法之后,那么子类的对象将无法访问父类中被覆盖的方法,但可以在子类方法中调用父类中被覆盖的方法,使用super(被覆盖的实例方法)或者父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法

this和super

-this 调用的是本类的方法和属性, this()调用本类构造方法时,也必须放在构造方法的首行,调用使用this调用方法时,首先会通过本类进行查找,如果本类没有指定的方法存在,才会调用父类中定义的方法;this存在有一个表示当前对象的概念,而super没有这样的概念

- super 调用的父类的方法和属性,使用super调用方法时,会直接查找父类中的方法,即:不会找本类中定义过的方法,super调用父类构造方法时必须要放在子类构造方法的首行,所以当调用构造方法时,“super()”与“this()”不能同时出现

方法重载与方法覆写

方法重载(overloading):在同一个类之中定义了方法名称相同,且参数的内容及个数不同的方法时,没有任何的 权限限制

方法覆写(override):在继承关系之中 子类定义了 与父类相同的方法名,参数类型及个数,包括返回值,需要考虑权限问题,即:被覆写的方法不能拥有比父类更严格的控制权限。

3.final关键字

从正常来讲,任何一个类都可以直接被其他的类所继承,那么如果说现在有一个类不希望被任何的类继承,则可以使用final关键字进行定义。

什么时候去定义不能被覆写的类或方法呢?

从开发而言,99%的情况下,应用程序的开发者是不需要利用final定义类或方法的,而在进行一些系统架构设计时就需要使用到此概念。

利用final定义的变量就成了常量,常量必须在定义的时候设置其默认的内容。那么在定义常量的时候为了让其与变量进行有效的区分,所以常量在进行命名时使用大写字母表示,另外,如果在程序之中 使用了 public static 定义了常量,那么就成了全局常量,从开发而言,定义全局常量代码较为常见
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 继承