知识点
1、继承
作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法
减少重复代码
条件:子类和父类要满足is a的逻辑关系,才能使用继承。
如:苹果 is a水果
语法:使用extends 连接子类和父类。子类 extends 父类
Java是单继承,一个类只能继承一个父类。
子类不能继承父类私有的属性,但是可以继承父类属性的GET/SET方法
super关键字:代表父类对象,可以调用父类的属性,父类的方法,
子类对象在创建的时候,默认调用父类的无参构造方法。
二、abstract关键字 抽象
abstract可以修饰类和方法
1.抽象类
不能被实例化
2.abstract也可用于方法——抽象方法
抽象方法没有方法体
抽象方法必须在抽象类里
抽象方法必须在子类中被实现,除非子类是抽象类
对应验证访问修饰符总结的代码:
NUM.1 同包验证:
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 }
NUM.2 不同包验证:
1 package b; 2 /** 3 * 在这里要先进行导包,如果不这样, 4 * 下面要想new A()就不行,new c()的意义在于建立一个子类方法, 5 * 从而观察经private修饰过后的变量是否能在其子类中调用 6 */ 7 import a.A; 8 public class C extends A{ 9 public static void main(String[]args){ 10 A a=new A(); 11 C c=new C(); 12 //c作为子类是可以调用以private访问修饰符修饰的c 13 //以及用public修饰的d 14 System.out.println(c.c); 15 System.out.println(c.d); 16 //而a作为new的父类,则因在不同包的原因而只能调用public修饰的d 17 System.out.println(a.d); 18 } 19 }
写到这里,我突然想到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虚拟机首先执行父类的构造方法,然后再执行子类的构造方法。
在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确的初始化。