【查缺补漏 | JAVA 基础知识 | 粗略复习①】

发布于:2023-02-14 ⋅ 阅读:(558) ⋅ 点赞:(0)

参考视频https://www.bilibili.com/video/av80585971


写本篇博客的目的旨在个人复习巩固知识,方便自己在线阅览。


1.this 关键字


this 修饰的变量用于指代成员变量

  • 方法的形参如果与成员变量同名,不带 this 修饰的变量指的是形参,而不是成员变量
  • 方法的形参没有与成员变量同名,不带 this 修饰的变量值的是成员变量

什么时候使用 this

  • 解决局部变量隐藏成员变量

this:代表所在类的对象引用

  • 即方法被哪个对象调用,this 就代表哪个对象。

在这里插入图片描述


2.继承


2.1.继承概述


继承的格式

  • 格式:public class 子类名 extends 父类名{}
  • 范例:public class Zi extneds Fu{}
    • Fu:是父类,也被称为基类、超类
    • Zi:是子类,也被称为派生类

继承中子类的特点

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

2.2.继承的好处和弊端


继承的好处

  1. 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
  2. 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)

继承的弊端

  • 继承让类与类之间产生了关系,类的耦合性增强了。
  • 当父类发生变化时,子类实现也不得不跟着发生变化,削弱了子类的独立性。

什么时候使用继承?

  • 继承体现的关系:is a
  • 假设法:有俩类: A 类 和 B 类。
    若满足 AB 的一种,或 BA 的一种,则说明二者间存在继承关系。
    此时可以考虑使用继承来体现,否则不可滥用继承。
  • 举例:苹果和水果,猫和动物,猫和老鼠

2.3.继承中变量的访问特点


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

  1. 子类局部范围找
  2. 子类成员范围找
  3. 父类成员范围找
  4. 若都没有,则报错(不考虑父类的父类 …)

2.4.super 关键字


super 关键字的用法和 this 关键字的用法相似

  • this:代表本类对象的引用。
    this 关键字指向调用该方法的对象,
    一般我们是在当前类中使用 this 关键字,
    故我们常说 this 代表本类对象的引用。
  • super:代表父类存储空间的标识。
    可以理解为父类对象引用。
关键字 访问成员变量 访问构造方法 访问成员方法
this this.成员变量
访问本类成员变量
this(…)
访问本类构造方法
this.成员方法(…)
访问本类成员方法
super super.成员变量
访问父类成员变量
super(…)
访问父类构造方法
super.成员方法(…)
访问父类成员方法

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


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

  • 因为子类会继承父类的数据,可能还会用到父类的数据。
    故子类初始化前,必先无参父类数据的初始化。
  • 每一个子类构造方法的第一句默认都是:super()

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

  • 通过使用 super 关键字去显示调用父类的带参构造方法
  • 自己在父类中提供一个无参的构造方法

推荐:自己在父类中给出无参构造方法。


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


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

  1. 子类成员范围找
  2. 父类成员范围找
  3. 若以上都没有就报错(不考虑父类的父类…)

2.7.方法重写


方法重写概述

  • 子类中出现了和父类中一模一样的方法声明。

方法重写的应用

  • 当子类需要父类的功能,而功能主体子类有自己特有的内容时,可以重写父类中的方法。
    这样一来,既沿袭了父类的功能,又重新定义了子类特有的内容。

@Override

  • 是一个注解。
  • 可以帮助我们检查重写方法的方法声明的正确性。

注意事项

  • 私有方法不能被重写(父类的私有成员,子类是不可以继承的)
  • 子类方法访问权限不能比父类方法的访问权限更低。(public > 默认 > 私有)

2.8.JAVA 中继承的注意事项


  • Java 中类只支持单继承,不支持多继承。
  • Java 中类支持多层继承。
/* Java 中类只支持单继承,不支持多继承 */

public class Son extneds Father,Mother{}//错误用法
/* Java 中类支持多层继承。 */

public class GarandFather{}

public class Father extends GrandFather{}

public class Son extends Father{}

3.状态修饰符


  1. final(最终态)
  2. static(静态)

3.1.final 关键字


final 关键字可以修饰成员方法,成员变量,类。


final 修饰的特点

  • 修饰方法:表明该方法是最终方法,不可被重写
  • 修饰变量:表明该变量是常量,不能再次被赋值
  • 修饰类:表明该类是最终类,不能被继承

final 修饰局部变量

  • 变量是基本类型:final 修饰它,指的是基本类型的数据值不能发生改变
  • 变量是引用类型:final 修饰它,指的是引用类型的地址值不能发生改变,
    但地址里面的内容可以发生改变。

Student 类

public class Student {
    int age;
}

FinalDemo 类

public class FinalDemo {
    public static void main(String[] args) {
        //final 修饰基本类型变量
        final int age = 20;
        //age = 100;//报错
        System.out.println(age);

        //final 修饰引用类型变量
        final Student s = new Student();
        s.age = 100;//不报错
        System.out.println(s.age);

        //s = new Student();//报错
    }
}

3.2.static 关键字


static 关键字可以修饰成员方法,成员变量。


static 修饰的特点

  • 被类的所有对象共享
    • 这也是我们判断是否使用静态关键字的条件
  • 可以通过类名调用
    • 当然,也可以通过对象名调用
    • 推荐使用类名调用

Student 类

public class Student {
    public String name;
    public static String city;

    public void show() {
        System.out.println(name + "在" + city + "上学");
    }
}

StaticDemo 类

public class StaticDemo {
    public static void main(String[] args) {
        Student.city = "徽州";//通过类名调用

        Student s1 = new Student();
        s1.name = "学生A";
        //s1.city = "徽州";//通过对象名调用
        s1.show();//输出结果:学生B在徽州上学

        Student s2 = new Student();
        s2.name = "学生B";
        s2.show();//输出结果:学生B在徽州上学
    }
}

static 访问的特点

  • 非静态的成员方法

    • 能访问静态的成员变量
    • 能访问非静态的成员变量
    • 能访问静态的成员方法
    • 能访问非静态的成员方法
  • 静态的成员方法

    • 能访问静态的成员变量
    • 能访问静态的成员方法

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


4.多态


4.1.多态概述


同一个对象,在不同时刻表现出来的不同形态。


举例:猫。

可以说猫是猫:猫 cat = new 猫();

也可以说猫是动物:动物 animal = new 猫();

这里猫在不同的时刻表现出来了不同的形态,这就是多态。


多态的前提和体现

  • 有继承 / 实现关系
  • 有方法重写
  • 有父类引用指向子类对象

4.2.多态中成员的访问特点


假设:

eat()Animal 类中的公开的成员方法,Cat 类中重写了该方法

weight 变量是 Cat 类中独有的成员变量。

Animal a = new Cat();

//System.out.println(a.weight);//会报错

a.eat();// eat() 是 Cat 类中的成员方法

多态中的编译都是先看左边的情况的(即父类)。

如果子类中存在方法重写的情况的话,编译就看的子类中的方法。

成员方法有重写方法的这种情况,但成员变量是没有重写的情况的。


4.3.多态的好处和弊端


多态的好处:提高了程序的拓展性

  • 具体体现:定义方法的时候。使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。

多态的弊端:不能使用子类的特有功能


4.4.多态中的转型


Animal a = new Cat();//向上转型

Cat c = (Cat) a;//向下转型

5.抽象类


5.1.抽象类概述


Java 中,一个没有方法体的方法应该定义为抽象方法

而类中如果有抽象方法,该类必须定义为抽象类


5.2.抽象类的特点


抽象类和抽象方法必须使用 abstract 关键字修饰。

  • public abstract class 类名{}
  • public abstract void 方法名()

抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。


5.3.抽象类的成员特点


成员变量

  • 可以是变量,也可以是常量

构造方法

  • 有构造方法,但不能实例化。
  • 抽象类中构造方法的作用:用于子类访问父类数据的初始化。

成员方法

  • 可以有抽象方法:限定子类必须完成某些动作
  • 也可以有非抽象方法:提高代码复用性

6.接口


6.1.接口概述


接口就是一直公共的规范标准,只要符合规范标准,大家都可以通用。

JAVA 中的接口更多的体现在对行为的抽象上。


6.2.接口特点


接口用关键字 interface 修饰

  • public interface 接口名{}

类实现接口用 interface 表示

  • public class 类名 interface 接口名{}

接口不能实例化

  • 接口如何实现实例化?参照多态的方式,通过实现类对象实例化。此即为接口多态。

接口的实现类

  • 要么重写接口中的所有抽象方法;要么其也为抽象类。

6.3.接口的成员特点


成员变量

  • 只能是常量
  • 默认修饰符:public static final

构造方法

  • 接口没有构造方法,也为接口主要是对行为进行抽象的,是没有具体存在的
  • 一个类如果没有父类,默认继承自 Object

成员方法

  • 只能是抽象方法
  • 默认修饰符:public abstract
  • 关于接口中的方法,JDK8 和 JDK9 中有一些新特性

6.4.类和接口的关系


类和类的关系

  • 继承关系,只能单继承,但是可以多层继承

类和接口的关系

  • 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。

接口和接口的关系

  • 继承关系,可以单继承,也可以多继承

6.5.抽象类和接口的区别


成员区别

抽象类 接口
变量,常量;有构造方法;有抽象方法,也有非抽象方法 常量;抽象方法

关系区别

类与类 类与接口 接口与接口
继承,单继承 实现,可以单实现,也可以多实现 继承单继承,多继承

设计理念区别

抽象类 接口
对类抽象,包括属性、行为 对行为抽象,主要是行为

门和警报的例子

一定open()close() 这俩动作

此外门还有报警功能:alarm()

public interface Alarm {
    void alarm();
}
public abstract class Door {
    public abstract void open();
    public abstract void close();
}
public class AlarmDoor extends Door implements Alarm {
    @Override
    public void alarm() {
    	//... ...
    }

    @Override
    public void open() { 
    	//... ...
    }

    @Override
    public void close() {
    	//... ...
    }
}

强调:抽象类是对事物的抽象,而接口是对行为的抽象


7.形参和返回值


7.1.类名作为形参和返回值


  • 方法的形参是类名,其实需要的是该类的对象
  • 方法的返回值时类名,其实返回的是该类的对象

7.2.抽象类名作为形参和返回值


  • 方法的形参是抽象类名,其实需要的是改抽象类的子类对象
  • 方法的返回值时抽象类名,其实返回的是改抽象类的子类对象

7.3.接口名作为形参和返回值


  • 方法的形参是接口名,其实需要的是该接口的实现类对象
  • 方法的返回值时接口名,其实返回的是改接口的实现类对象

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到