java 中的继承
继承的概念
继承就是子类继承父类的特征和行为,使得子类具有父类得属性和方法。
继承得关键字:extends
语法格式:<modifier> class <name> [extends superclass] {......}
通过继承,子类自动拥有基类(superclass)得所有成员(成员变量和方法)。
java只支持单继承,不允许多继承; 但是c++中允许多继承。
一个子类只能继承一个父类,但是一个父类却可以派生多个子类(一个孩子只有一个爸爸,但是爸爸可以有多个孩子)
简单的例子
1 /* 2 * 父类 Person 3 */ 4 class Person { 5 private String name; 6 private int age; 7 8 public String getName() { 9 return name; 10 } 11 public void setName(String name) { 12 this.name = name; 13 } 14 public int getAge() { 15 return age; 16 } 17 public void setAge(int age) { 18 this.age = age; 19 } 20 21 22 } 23 24 /* 25 * 子类 Student 26 */ 27 class Student extends Person { 28 private String school; 29 30 public String getSchool() { 31 return school; 32 } 33 34 public void setSchool(String school) { 35 this.school = school; 36 } 37 38 39 } 40 41 /* 42 * 测试类 43 */ 44 public class Test { 45 public static void main(String[] args) { 46 Student stu=new Student(); 47 stu.setName("刘杰"); 48 stu.setAge(22); 49 stu.setSchool("淮阴师范学院"); 50 51 System.out.println("姓名:"+stu.getName()); 52 System.out.println("年龄:"+stu.getAge()); 53 System.out.println("学校:"+stu.getSchool()); 54 55 } 56 }
继承在内存中的解析:
Student stu =new Student();
stu 对象的引用,存放在stack中,指向-->new Student();
new Student()因为是new 出来的对象,所以存放在heap中。但是Student是子类,他继承父类Person。Student(子类)包含Stundent(父类),子类比父类大!!!
内存分析如下所示:
访问控制
java权限修饰符(modifier) public protect private置于类的成员定义或者声明前。
作用:限定其他对象对该类对象成员的访问权限。
1 package com.Demo; 2 3 /* 4 * 父类 Person 5 */ 6 class Person { 7 private String name; 8 private int age; 9 10 public String getName() { 11 return name; 12 } 13 public void setName(String name) { 14 this.name = name; 15 } 16 public int getAge() { 17 return age; 18 } 19 public void setAge(int age) { 20 this.age = age; 21 } 22 23 24 } 25 26 /* 27 * 子类 Student 28 */ 29 class Student extends Person { 30 private String school; 31 32 public String getSchool() { 33 return school; 34 } 35 36 public void setSchool(String school) { 37 this.school = school; 38 } 39 40 41 } 42 43 class Access { 44 45 //私有变量安全性更高 46 private int i=0; 47 48 //default包权限 同一个包里面的class 可以访问其他class类里面的default 变量 49 //c++中不存在default 访问权限符 50 int j=1; 51 52 //受保护 同一个包里面可以访问protect变量,而且该类的子类还可以protect 53 protected int z=2; 54 public int y=3; 55 56 //public 类型访问类中的私有变量 57 public int getI(){ 58 return i; 59 } 60 } 61 62 class AccessOne extends Access { 63 64 } 65 /* 66 * 测试类 67 */ 68 public class Test { 69 public static void main(String[] args){ 70 71 Access a=new Access(); 72 73 /* 74 * AccessOne继承于Access,拥有Access的所有变量成员(包括private),但是对于private没有使用权限,有访问权限! 75 */ 76 AccessOne a1 =new AccessOne(); 77 Test t=new Test(); 78 /* 79 * 报错 i是用private修饰,即使是用Access.i访问也没有任何用。 80 * 只能在class Access本身类中用成员方法进行访问,而且定义的方法还要用public进行修饰。 81 * 若继续用private还是无法进行访问 82 */ 83 //System.out.println(a.i); 84 85 System.out.println(a.getI()); 86 87 System.out.println(a.j); 88 89 System.out.println(a.z); 90 System.out.println(a1.z); 91 } 92 }