文章目录
1.1什么为继承??
继承其实继承就是对共性的抽取
/**
*比如狗和猫都有名字和姓名,都吃饭
*
*
*
*/
class Dog{
public String name;
public int age;
public void eat(){
System.out.println(name+" 正在吃饭");
}
public void bark(){
System.out.println(name+" 正在汪汪!!!");
}
}
class Cat{
public String name;
public int age;
public void eat(){
System.out.println(name+" 正在吃饭");
}
public void miaomaio(){
System.out.println(name+"正在喵喵瞄!!!");
}
}
所以上面那个,就可以对他们的共性进行抽取
/**
*此时我们就可以用子类( Dog)extends父类(Animal)继承他们的共性从而让代码变简洁,
*代码也可以复用
*
*
*/
class Animal{
public String name;
public int age;
public void eat(){
System.out.println(name+" 正在吃饭");
}
}
class Dog extends Animal{
public int weight;//体重
public void eat(){
System.out.println(name+" 正在吃饭");
}
public void bark(){
System.out.println(name+" 正在汪汪!!!");
}
}
class Cat extends Animal{
public void miaomaio(){
System.out.println(name+"正在喵喵瞄!!!");
}
}
/**
*此时我们就可以调用父类的方法,变量用于子类。(共性进行抽取)
*当然猫的也可以
*/
public class Test {
public static void main(String[] args) {
Dog dog=new Dog();
dog.name="狗子";
dog.age=3;
dog.eat();
dog.bark();
}
}
⚫此时他们的内存是这样的
2.1我们如何访问子类和父类同名成员变量???
/**
*
*/
class Base{
public int a=1;
public int b=2;
}
class Date extends Base{
public int a=11;
public int c=4;
public void test(){
//我们可以用关键字super来调用父类的成员(super代表的是子类从父类继承过来的数据)
System.out.println("调用父类的a "+super.a);//
System.out.println("调用子类的a "+a);//自己有就优先访问自己的a(就近原则);
}
}
2.2如何调用相同的父类的成员方法
class Base{
public void add1(){
System.out.println("Base:当中的成员方法");
}
}
class Date extends Base{
public void add1(){
System.out.println("Date:当中的成员方法");
}
public void test(){
add1();//这个也是就近原则子类有优先调用自己的没有在找父类的
super.add1();//用super来调用父类的
}
}
public class Test2 {
public static void main(String[] args) {
Date date=new Date();
date.test();
}
}
2.3super关键字
该关键字主要作用:在子类方法中访问父类成员
3.1父类构造方法提供后子类也要重新提供构造方法???
class Animal{
public String name;
public int age;
public Animal(String name, int age) {//父类提供一个构造方法
this.name = name;
this.age = age;
}
public void eat(){
System.out.println(name+" 正在吃饭");
}
}
class Dog extends Animal{
public int weight;
public Dog(String name, int age) {
//因为父类提供构造方法了所以我们要用super来初始化父类的数据
super(name, age);//super要在第一行不然会报错
}
public void eat(){
System.out.println(name+" 正在吃饭");
}
public void bark(){
System.out.println(name+" 正在汪汪!!!");
}
}
注意:当父类没有构造方法时,子类会默认提供无参的构造方法初始化 如下
class Dog extends Animal{
public int weight;
public Dog() {
super();//super要在第一行不然会报错
}
public void eat(){
System.out.println(name+" 正在吃饭");
}
public void bark(){
System.out.println(name+" 正在汪汪!!!");
}
}
1.0代码块的执行顺序
class Animal{
public String name;
public int age;
{
System.out.println("Animal:>>>实例代码块");
}
static {
System.out.println("Animal:>>静态代码块");
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Animal:>>构造代码块");
}
}
class Dog extends Animal{
public int weight;
{
System.out.println("Dog:>>>实例代码块");
}
static {
System.out.println("Dog:>>静态代码块");
}
public Dog(String name, int age) {
super(name, age);//在这里要执行父类的代码块
System.out.println("Dog:>>构造代码块");
}
}
public class Test {
public static void main(String[] args) {
Dog dog=new Dog("小狗",3);//运行后执行顺序如下
}
注意:静态代码块是先被执行的且只执行一次
且代码块都是先静态在实例,后构造