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

java 继承

2016-05-29 16:40 309 查看
一、java继承

1.什么是继承?

继承是指一个对象可调用另一个对象的方法和属性。(一个对象从另一个对象获取属性和方法的过程)

一个类A包含的属性和方法,另外的类B也有部分属性和方法与之相同,这时可将共有的属性及方法作为一个类,即父类。

比如:学生类和老师类都有姓名、年龄、性别,还有吃饭的行为,把人类作为父类,学生和老师继承人类,关键字为extends。

//人类

public class People {
String name;  //姓名
int age;     //年龄
String sex;   //性别

public People(String name,int age)
{
this.name = name;
this.age = age;
}
public void eat()
{
System.out.println("人正在吃饭");
}

}

//学生

public class Student extends People{

public Student(String name,int age)
{
super(name,age);
}
public void classes()
{
System.out.println(name+"正在上课");
}

}
//老师

public class Teacher extends People{
public Teacher(String name,int age)
{
super(name, age);
}
public void teach()
{
System.out.println(name+"正在上课");
}

}

//Main测试类

public class Main {

public static void main(String[] args) {
Student s1 = new Student("lan", 18);
Teacher t1 = new Teacher("mr.yang",26);
s1.eat();
s1.classes();
t1.eat();

}

}(同一个包下的测试类)

父类People包含它们所共有的属性和方法(姓名,年龄、吃)。

但是如果我将eat()方法改为私有private,那么eat()方法将不会被学生类和老师类所继承。

即private void eat()
{
System.out.println("人正在吃饭");
}

在学生和老师类中将不会继承私有的eat()这个方法。(构造函数不会被继承)

另外需要注意的是创建子类对象时会先创建父类,如果父类的构造方法里有参数,在子类里的构造函数里必须用super()来为之传参进行初始化,否则将会报错。

父类如下

子类报错情况:

还有当我们创建类的时候总是在继承,如果没有明确的指出继承的类,就总是隐式的从根类继承object。

2.访问修饰符

在哪些地方可以访问父类里的方法和属性呢?下面给出了四种。

访问域从大到小为:public  >  protected > 默认不写 >private

这里默认不写修饰符的方法和属性,在外部包里,子类也不能访问该方法和属性。

3.关键字super、this、final

加super关键字可在子类里调用与父类同名的方法或成员变量。

用法super.成员变量/方法

如在student里加方法eat()

 public void eat()
{

super.eat();    //调用父类方法
System.out.println("学生正在吃饭");
}

显示结果为:

人正在吃饭

学生正在吃饭

student子类重写了父类的eat()方法,使用super.eat(),可调用父类的eat()方法。

重写后student对象调用eat()方法调用重写的方法。

super的第二种使用上面也提到,在子类的构造器中显示的调用父类的构造器。

使用方法super(p1,p2);

如例子中的super(name, age);

this关键字

在这里说最常用的一种

当成员变量和局部变量重名时,在方法中使用this,表示该方法所在类中的成员变量。(this表示当前对象自己)

如上述代码中的this.name = name;

final关键字

在方法和属性前加final关键字,属性和方法都可以被继承,但是不可以被改变,方法也不能被子类重写。

如将People类中的name属性改为

final String name = "rrr";  //姓名

如果你在子类中使用this.name = "ee";将会报错。

如果将People类的方法eat()改为

final public void eat()
{
System.out.println("人正在吃饭");
}

则在子类中不可再重写eat()方法。

在类前加final关键字,则该类不可被继承

如:public final class People {}

则People不可被继承。

3.引用传递/值传递

复杂数据类型属于引用型数据类型

基础数据类型属于值传递(boolean/char/byte/short/float/double/int/long)

简单值传递如:

void change(int a)

{

 a = 100;

}

int a = 99;

change(a);

System.out.println(a);

a的值一直为99;

基本数据类型按值传递,相当于复制一份过去,引用数据类型按地址传递,根据地址使用同一份数据,如果数据被改,那么原有的数据也会被改。

引用数据类型例如数组。

4.父类引用子类实体
 子类实体可以指向父类引用:People p = new student();但p并没有student的方法,可以将p强制转换为student

student s1 = (student)p;

在强制转换里,必须知道p所指向的实体,如果将People p1 = new Teacher()

而转换用student s1 = (student)p;那么运行时会报错,所以,这里我们可以用instanceof判断一下p是不是studen
4000
t实例

if(p instanceof student)

{

student s1 = (student)p;

}

对于student s = new student();

在这里说明一点:student s 在栈里,保存地址,而new student()存在堆里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息