本系列博客汇总在这里:Java系列_汇总
目录
- 一、简介
- 二、继承语法
- 三、继承的特点
- 四、类的单继承,多继承(java不支持),多级继承
- 五、接口的多继承
- 六、继承的内存结构
一、简介
继承:描述事物的时候,我们如果发现几个类有重复的属性和方法,我们就可以采用采用继承的方式来设计。
二、继承语法
- 使用 extends 关键字来继承
class 子类 extends 父类
{
子类属性
子类方法
}
三、继承的特点
- 子类只能继承父类中的非 private 的属性,如果要继承就得提供公共的 set() 和 get () 方法,私有的方法和属性是子类无法继承下来的。
- 子类可以使用 extends 关键字继承父类的属性和方法以外,子类还可以有自己特有的属性和方法。
- 父类更通用,子类更具体。
四、类的单继承,多继承(java不支持),多级继承
- 单继承
- 多继承(java不支持)
- 多级继承
- 示例
class A extends B
{
}
class A extends B,C
{
}
class B extends A
{
}
class C extends B
{
}
//A称为超类
/*
父类
*/
class Teacher
{
private String name;
private int age;
//-------get()和set()方法,提供给外界访问和修改内部私有属性值-------
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
this.age= age;
}
public String getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
//--------------------------------------------------------------------
//父类方法
public void sleep()
{
System.out.println("老师在睡觉");
}
}
/*
子类,继承Teacher类
*/
class PHPTeacher extends Teacher
{
//子类独有方法
public void teachPHP()
{
System.out.println(this.getName()+"老师在教php 年龄:" +this.getAge());//this是可以不写的,谁调用this就是谁
}
}
/*
子类,继承Teacher类
*/
class JavaTeacher extends Teacher
{
//子类独有方法
public void teachJava()
{
System.out.println(getName()+"老师在教java 年龄:" +getAge());
}
}
/*
主类
*/
class Welcome
{
public static void main (String[] args)
{
JavaTeacher jt = new JavaTeacher();
jt.setName ("张三");
jt.setAge(9);
jt.sleep();
jt.teachJava();
PHPTeacher pt = new PHPTeacher();
pt.setName ("李四");
pt.setAge(8);
pt.sleep();
pt.teachPHP();
}
}
五、接口的多继承
- 示例代码
interface A
{
public void method();
}
interface B
{
public void method();
}
interface C extends A,B
{
}
class Welcome
{
public static void main(String[] args)
{
}
}

从上面可以看出,接口可以多重继承。
六、继承的内存结构
方法区的 main() 方法先进栈,往下走 new 就会在堆中产生一个对象,栈中依然是存地址,此地址指向堆中的相应对象的地址,接下来因该是给属性赋值了,发现自己并没有给属性赋值的功能,就会到父类中去找,然后就会在 this 当中又产生一个实例,叫 super;于是在 super 就可以找到 name 和 age 了,然后就可以进行赋值了。之后 teachJava{}; 这个方法从方法区进栈,由于在 teachJava{}; 方法中调用的 name 和 age 是省略了他们之前的 this 的,那么谁调用 this,this.name 和 this.age 就是谁的,显然这个方法是 jt 调用的,jt 指向 0x999 这个地址,那么 teachJava{}; 方法中的 name 和 age 也指向 0x999 这个地址,进而进行了赋值等操作;之后的 teachPHP{}; 方法也是一样的。
如有错误,欢迎指正!