知识点
1、继承
作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法
减少重复代码
条件:子类和父类要满足is a的逻辑关系,才能使用继承。
如:苹果 is a水果
语法:使用extends 连接子类和父类。子类 extends 父类
Java是单继承,一个类只能继承一个父类。
子类不能继承父类私有的属性,但是可以继承父类属性的GET/SET方法
super关键字:代表父类对象,可以调用父类的属性,父类的方法,
子类对象在创建的时候,默认调用父类的无参构造方法。
对应验证访问修饰符总结的代码:
1 package a; 2 public class A { 3 private String a="1"; 4 String b="2"; 5 protected String c="3"; 6 public String d="4"; 7 }
1 package a; 2 public class B { 3 public static void main(String[]args){ 4 A a=new A(); 5 System.out.println(a.b);//可以调用除用private修饰的之外所有的变量 6 } 7 }
1 package b; 2 import a.A; 3 public class C { 4 public static void main(String[]args){ 5 A a=new A(); 6 // C c=new C(); 7 System.out.println(a.d);//仅能调用public修饰的变量 8 } 9 }
写到这里,我突然想到java默认的调用方法是用无参的方法,如果有在调用时设定了参数就会使用有参构造方法,
此时不由想到父类和子类的代码块调用,于是我设计了以下代码去进行测试
1 package day20190227; 2 public class Pet { 3 private String name; 4 private int health; 5 private int love; 6 public Pet(){ 7 System.out.println("父类的无参构造方法调用"); 8 } 9 public Pet(String name,int health,int love){ 10 System.out.println("父类的有参构造方法调用"); 11 this.name=name; 12 this.health=health; 13 this.love=love; 14 } 15 public String getName() { 16 return name; 17 } 18 public void setName(String name) { 19 this.name = name; 20 } 21 public int getHealth() { 22 return health; 23 } 24 public void setHealth(int health) { 25 this.health = health; 26 } 27 public int getLove() { 28 return love; 29 } 30 public void setLove(int love) { 31 this.love = love; 32 } 33 //输出宠物信息 34 public String printInfo(){ 35 return "我的名字叫"+name+",健康值为"+health+",亲密度为"+love; 36 } 37 }
1 package day20190227; 2 /** 3 * 狗类,继承Pet类 4 * @author Administrator 5 * 6 */ 7 public class Dog extends Pet { 8 private String strain; 9 public Dog(){ 10 System.out.println("狗类无参构造方法调用"); 11 } 12 public Dog(String name,int health,int love,String strain) { 13 //super.printInfo();调用父类的方法 14 //super.name;调用父类的属性 15 super(name,health,love);//调用父类构造方法,必须在第一行 16 System.out.println("狗类有参构造方法调用"); 17 this.strain = strain; 18 } 19 public String getStrain() { 20 return strain; 21 } 22 public void setStrain(String strain) { 23 this.strain = strain; 24 } 25 }
在设定好父类和子类的无参构造方法和有参构造方法后,我在其中分别加入了一段说明语句,而后再重新编辑了一个TestDogCon类用于测试;
1 package day20190227; 2 /** 3 * 有参&无参调用测试 4 * @author Administrator 5 * 6 */ 7 public class TestDogCon { 8 public static void main(String[] args) { 9 Dog dog=new Dog("小华",90,90,"拉布拉多犬"); 10 } 11 }
经测试发现当dog设定了数据时,显示的都是
而当将new Dog()中的数据删去后,显示的则是
总结:在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后再执行子类的构造方法。
在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确的初始化。
原文:https://www.cnblogs.com/SUN99bk/p/10446017.html