继 承

1.继承是面向对象三大特征之一。可以使子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。

2.继承格式:

Public class 子类名 extends 父类名{}

父类:也叫做超类、基类

子类:也称为派生类、

3.继承中子类的特点:

子类可以有父类的内容、子类还可以有自己特有的内容。

 

继承的好处和弊端:

好处:提高代码复用性(多个类相同的成员可以放到同一个类中)

提高代码维护性(如果方法的代码需要修改,修改一处即可)

 

继承的弊端:

l 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类也随之变化,削弱了子类的独立性。

4.什么时候使用继承?

体现关系:is a

假设法:有两个类,A类和B类,满足AB的一种,BA的一种,说明他们存在继承关系。这时可以考虑使用,否则就不能滥用。

举例:苹果和水果、猫和动物、猫和狗

5.继承中变量的访问特点:

在子类方法中访问一个变量。

  • 子类局部方法中找
  • 子类成员变量找
  • 父类成员范围找

如果都没有就报错(不考虑父亲的父亲...

 

6.super关键字和this关键字的用法

l This:代表本类对象的引用

l Super:代表父类存储空间的标识(可以理解为父类对象引用).

关键字

访问成员变量

访问构造方法

访问成员方法

This

This.成员变量

访问本类成员变量

This(...)

访问本类构造方法

This.成员方法

访问本类成员方法

super

Super.成员变量

访问父类成员变量

Super(...)

访问父类构造方法

Super.成员方法(...)

访问父类成员方法



/**
 * @author murongkang
 * @date 2019-08-24 10:35
 */
public class Fu {
    public int age=40;
    
    }

public class Zi extends Fu {
    public int age=20;

    public void show(){
        int age=30;
        System.out.println(age);                //继承访问特点,方法内的age.
        System.out.println(this.age);          //访问的是本类的成员变量。
        System.out.println(super.age);         //super.age 访问的是父类的变量

    }
}

public class Demo {
    public static void main(String[] args) {
        //创建对象,调用方法
        Zi zi = new Zi();
        zi.show();

    }
}

 

 

7.继承中构造方法的访问特点:

子类中所有的构造方法都默认访问父类中的无参构造方法

为啥呢?

l 因为子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化之前,一定要先完成父类数据的初始化。

每一个子类构造方法的第一条语句默认都是super()

 

如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

通过使用super关键字去显示调用父类的带参构造方法。

l 在父类中自己提供一个无参构造方法。推荐:自己给出无参构造方法。

package com.ithima;

/**
 * @author murongkang
 * @date 2019-08-24 10:35
 */
public class Fu {
 /*  public Fu(){
       System.out.println("fu类无参构造被调用");
   }*/
 public Fu(){}            //父类中手动添加一个无参构造方法
   public Fu(int age){
       System.out.println("fu类有参构造被调用");

   }
    }

package com.ithima;

/**
 * @author murongkang
 * @date 2019-08-24 10:50
 */
public class Zi extends Fu {
    public Zi(){
        super(20);      //当父类中无参构造没有时,直接子类中super(值),同样可以给父类初始化。指定使用有参构造
        System.out.println("zi类无参被调用");
    }
    public Zi(int age){
        super(20);
        System.out.println("zi类有参被调用");
    }
}

package com.ithima;

/**
 * @author murongkang
 * @date 2019-08-24 10:53
 */
public class Demo {
    public static void main(String[] args) {
        //创建对象,调用方法
//        Zi zi = new Zi();
        Zi zi2 = new Zi(20);
//        Fu fu = new Fu();
    }
}

 

8.继承中成员方法的访问特点:

通过子类对象访问一个方法

l 先在子类成员范围中找

l 父类成员范围找

如果都没有就报错(不考虑父亲的父亲。。。)

 

  1. super内存图:
  1. 方法重写:

方法重写概述:子类中出现了和父类中一模一样的方法声明。

方法重写的应用:当子类需要父类的功能,而子类有自己特有内容

可以重写父类的方法,这样既沿袭父类功能,又定义子类内容。

@Override     //检查方法声明的正确性

 

@Override是一个注解、可以帮助检查重写方法的声明的正确性。

 

  1. 方法重写注意事项:

私有方法不能被重写(父类私有成员子类不能继承)

子类方法访问权限不能更低(public>默认>私有).

 

  1. Java中继承的注意事项:

Java中只支持单继承,不支持多继承。

Java中类支持多层继承。

 

  1. 继承:案例

public class Animal {
    private String name;
    private int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class Cat  extends Animal{
    public Cat() {
    }

    public Cat(String name, int age) {
        super(name, age);
    }
    public void show(){
        System.out.println("抓老鼠");
    }
}

public class Dog  extends Animal{
    public Dog() {
    }

    public Dog(String name, int age) {
        super(name, age);
    }
    public void show(){
        System.out.println("看门");

    }
}

public class Demo {
    public static void main(String[] args) {
        //创建对象
        Cat cat = new Cat("猫",2);
        System.out.println(cat.getName()+cat.getAge());
        cat.show();

        Dog dog = new Dog("大狗",22);
        System.out.println(dog.getName()+dog.getAge());
        dog.show();
    }
}

 

2

抓老鼠

大狗22

看门

 

  1. 包的概述和使用:

包其实就是文件夹

作用:就是对类进行分类管理。

包的定义格式:

Package 包名;

带包的Java类编译和执行

手动建包

  1. 导包的概述和使用

public class Demo {
    public static void main(String[] args) {
        com.it1.Teacher t=new com.it1.Teacher();  //包名.类名
        t.show();
    }
}

 

使用不同包下的类时,使用的时候要写全路径,写起来麻烦,为简化带包操作,java提供导包功能。

导包的格式:

Import 包名;

Import cn.itcase.Teacher

 

16.修饰符的分类

l 权限修饰符

l 状态修饰符

权限修饰符的访问权限:

修饰符

同一个类中

同一个包中子类无关类

不同包的子类

不同包的无关类

Private

 

 

 

默认

 

 

Protected

 

public

 

状态修饰符

Final(最终的)

Static(静态的)

Final关键字是最终的意思,可以修饰成员方法,成员变量、类。

Final修饰的特点:

l 修饰方法:表明该方法是最终方法,不能被重写

l 修饰变量:表明该变量是常量,不能再次被赋值。

l 修饰类:表明该类是最终类,不能被继承。

 

  1. final修饰局部变量

l 变量是基本类型数据final修饰基本数据类型,指基本类型的数据值不发生改变。

l 变量是引用数据类型:指的是引用类型的地址值不改变,但址值里面的内容是可以发生改变的。

 

  1. Static关键字是静态的意思,可以修饰成员方法,成员变量。

Static修饰特点:

l 被类的所有对象共享

      这也是我们判断是否使用静态关键字的条件

l 可以通过类名调用、当然也可以通过对象名调用。推荐使用类名调用。

 

Static访问特点:

非静态成员方法:

l 能访问非静态成员变量、非静态成员方法

l 能访问静态成员变量、静态成员方法

静态成员方法:

l 能访问静态成员变量、静态成员方法。

总结一句话:静态成员方法只能访问静态成员。

 

posted @ 2020-02-03 17:48  Mrmukk  阅读(116)  评论(0编辑  收藏  举报