菜鸟学Java笔记day2

1,继承(extends)

子类 extends 父类,通过继承,子类就拥有了父类所有的成员(包括变量和方法)。Java只支持单继承,不允许多继承,即一个子类只能有一个父类,一个父类可以派生出多个子类。Java通过接口实现类似于多继承特点。
       可以说,子类比父类大,new一个子类时,子类对象包含了一个父类对象(包含了父类的成员对象)和自己的成员变量。
 
2,访问权限
       可以修饰类的成员变量,也可以修饰class。Java中有以下四个访问权限符:
       1)    private,最严格的访问控制,只有所属类的成员才可以访问到private变量。父类的private变量也会被子类全部继承,但是不能访问它(即有所有权,但无使用权。
       2)  default,默认权限(也叫包权限),属于同一个包的成员可以访问到defalult成员变量,在修饰一个变量为默认权限时,不需要写出default。
       3)  protected,受保护的(不是公开开放的),同一个包中的其他类可以访问,同时,子类也可对其进行访问。
       4)  public,所修饰变量在任何地方都可以访问到。
       对于class的权限修饰只可以用public和default,public类可以在任意地方被访问,default类只可以被同一个包内部的类访问。
 
3,重写(OverWrite)
       子类可以根据需要,对从基类中继承来的方法进行重写,重写方法必须和被重写的方法具有相同的方法名称、参数列表和返回类型,重写方法不能使用比被重写方法更严格的访问权限。有如下示例:
  
  
  
  
  1. public class OverWrite{ 
  2.     public static void main(String[] args){ 
  3.          
  4.         Person person = new Person(); 
  5.         Student student = new Student(); 
  6.          
  7.         person.setName("none"); 
  8.         person.setAge(100); 
  9.         student.setName("Jobs"); 
  10.         student.setAge(24); 
  11.         student.setSchool("XXU"); 
  12.         System.out.println(person.getInfo()); 
  13.         System.out.println(student.getInfo()); 
  14.     } 
  15.  
  16. class Person{ 
  17.     private String name; 
  18.     private int age; 
  19.      
  20.     public void setName(String name){this.name = name;} 
  21.     public void setAge(int age){this.age = age;} 
  22.     public String getName(){return name;} 
  23.     public int getAge(){return age;} 
  24.     public String getInfo(){ 
  25.         return "name: "+name+"\n"+"age: "+age; 
  26.     } 
  27.  
  28. class Student extends Person{ 
  29.      
  30.     private String school; 
  31.      
  32.     public String getSchool(){return school;} 
  33.     public void setSchool(String school){this.school = school;} 
  34.     //重写父类的getInfo()方法,添加了学校显示 
  35.     public String getInfo(){ 
  36.         return "Name: "+getName()+"\nage: "+getAge()+"\nschool: "+school; 
  37.     } 
       上述代码的内存分析如下图所示:栈内存中的彩色变量在成员方法执行完毕后被擦掉。

内存分析图

4,super关键字
       使用super关键字引用基类的成分。this是当前对象的引用,super是当前对象的父类对象的引用。在new一个子类对象的时候,在内存中,这个子类对象会包含一个父类对象。同时也会有一个this引用,指向对象自身;还有一个super引用,指向当前对象的父对象。代码示例:
 
  
  
  
  
  1. class Father{ 
  2.     public int value;               //若把public 改为private,则Child类将无法访问到 
  3.     public void printValue(){ 
  4.         value = 100
  5.         System.out.println("Father's Value: "+value); 
  6.     } 
  7.  
  8. class Child extends Father{ 
  9.     private int value; 
  10.     //重写父类的printValue()方法,并调用父类的该方法 
  11.     public void printValue(){ 
  12.         super.printValue();     //调用父类方法:super.方法名() 
  13.         value = 101
  14.         System.out.println("Child's Value: "+value); 
  15.         System.out.println(value); 
  16.         System.out.println(super.value);        //调用父类变量:super.变量名 
  17.     } 
  18.  
  19. public class SuperTest{ 
  20.     public static void main(String[] args){ 
  21.         Child c = new Child(); 
  22.         c.printValue(); 
  23.     } 
内存分析图如下: 
 

 
5,继承中的构造方法
       子类对象构造之前必须要调用父类的构造方法,也就是先构造父类对象。用super(参数列表)调用父类的构造方法,用this(参数列表)调用自己的构造方法。注意:如果调用super(),则super()必须写在子类构造方法的第一行。若子类的构造方法中没有显示调用父类构造方法,则系统自动调用父类无参构造方法,若父类中没有无参构造方法,则出错。

 

你可能感兴趣的:(继承,super,访问权限,重写)