继承
继承概述
📄 面向对象的三大特征之一;
📄 可以继承父类属性;
📄 还可以新增自己的属性;
📔 格式:**public class 子类名 extends 父类名{}**
📄 父类:也被称为基类或者超类;
📄 子类:也被称为派生类;
继承的优缺点
📔 优点
📄 提高了代码的复用性(多个类相同的成员可以放到同一个类中);
📄 提高了代码的维护性(如果方法的代码需要修改,修改一处(父类中)即可);
📔 缺点
📄 继承让类与类之间产生了关系,类的耦合性增强了;
📄 当父类发生变化时子类的实现也发生变换,削弱了子类的独立性;
📔 什么时候用继承
📄 继承体现的关系:is a;
📄 假设法:两个类A和B,如果满足A时B的一种,或者B是A的一种,则可以考虑使用继承;
📄 Eg:苹果和水果,猫和动物;
继承中变量的访问特点
📔 在子类中访问一个变量
- 在子类局部范围内找;
- 在子类成员范围内找;
- 在父类成员范围内找;
- 如果都没有则报错;
📔 super 关键字
📄 访问本类的成员变量使用**this**;
📄 访问父类的成员变量使用**super**;
| 关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
|---|---|---|---|
| this | this.成员变量 访问本类中的成员变量 |
this.ClassName(…) 访问本类构造方法 |
this.成员方法(…) 访问本类的成员方法 |
| super | super.成员变量 访问父类中的成员变量 |
super.ClassName(…) 访问父类构造方法 |
this.成员方法(…) 访问父类的成员方法 |
📔 构造方法的访问
📄 在构造子类之前,由于子类继承父类,因此可能会使用到父类的数据,因此会先构造父类,在构造子类;
📄 每一个子类构造方法的第一句都默认为:**super();**
📄 在父类中没有无参构造方法:
📃 使用**super(data);**调用父类的有参构造方法;
📃 在父类中手动添加无参构造方法;(推荐)
继承中成员变量的访问特点
📄 子类可以调用父类中的方法;
📄 优先级同上;
📔 关于在访问时的各种内存加载
📑 注意栈的处理情况,“先进后出”;
方法重写
📄 子类中出现和父类一样的方法声明;
📄 当子类需要父类的功能,而功能的主体子类自己有特有内容,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容;
📄 **@Override**
- 是一个注解(注解后面会学习到);
- 可以帮助我们检查重写方法的声明的正确性;
📔 方法重写注意事项
📄 成员函数的修饰符默认时;
- 不是public,也不是private;
- 权限没有Public大;
📄子类重写父类方法时,只要访问权限不比父类低就行;
- 如父类用默认修饰符,子类可以用public或者默认;
- 父类public子类public;
📄 访问权限:**public** >** 默认** > **private**
Java中继承的注意事项
📔 类只支持单继承,不支持多继承;
📔 Java中类支持多层继承;
📔 继承中构造方法注意事项
📄 子类中不能直接对继承于父类的private变量赋值;
📄 可用super();构造方法在子类构造方法中调用父类构造器;
修饰符
package 包
📔 包的概述
📄 其实就是文件夹;
📄 作用:对类进行分类管理;
📔 创建包
📄 格式:package 包名;(多级包用.分开)
📄 范例:**package com.itheima**
📄 在idea等开发软件中创建包较为方便,但是用记事本创建需要一定的注意事项;
📄 在文件目录中:需要建立一个文件夹,模拟包的存放
package com.songwang.test //用记事本开发时,自己定义包public class HelloWorld{public static void main(String[] args){System.out.println("HelloWorld!");}}/*cmd控制台D:\JavaProjects>javac HelloWorld.javaD:\JavaProjects>java com.songwang.test.HelloWorldHelloWorld!*/
📔 手动创建包
📄 在test目录下,将通过javac编译的 .class文件剪切到该目录下;
📄 使用java 命令执行文件;
📔 自动创建包
📄 **-d . HelloWorld.java** 注意其中 . 的左右都有空格;
/*cmd控制台:D:\JavaProjects>javac -d . HelloWorld.javaD:\JavaProjects>java com.songwang.test.HelloWorldHelloWorld!*/
📔 导包
📄 **import 包名;**
权限修饰符
📄 private
📄 默认
📄 protected
📄 public
| 修饰符 | 同一个类中 | 同一个包中 子类无关类 |
不同包的子类 | 不同包的无关类 |
|---|---|---|---|---|
| private | √ | |||
| 默认 | √ | √ | ||
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
状态修饰符
📔 **final** (最终态)
📄 修饰方法:表示最终方法,不能被改写;
📄 修饰变量:表明最终变量,不能被修改;
📄 修饰类:表明最终类,不能被继承;
static关键字
📔 静态变量
📄 有些变量希望在内存中只有一份,而且能被一个类所有的实例对象所共享;
📄 例如学校名称,在创建学生类的时候,所有成员都在一所学校,及没有必要为每一个学生再分配一个空间用以储存学校,只需要共享一个变量即可;
📄 语法:**static 变量类型 变量名;**
📄 访问:ClassName.变量名;
📑 **static**关键字只能用于修饰成员变量,不能修饰局部变量;
📔 静态方法
📄 一般情况下,要使用类中的成员方法,必须先创建对象再访问该方法,若是想不通过创建对象就能访问成员方法,可以通过用**static**关键字修饰该方法,使其成为静态方法,可以直接通过类名对其进行访问;
📄 只需在方法前加上**static**关键字即可;
📄 访问时可以通过**类名.方法名**,也可以通过**实例对象名.方法名**;
📑 注意:在**static**修饰的方法中只能访问**static**修饰的变量,原因是没有**static**修饰的变量只能通过实例化对象访问,不能直接通过类名访问;
📔 静态代码块
📄 Java中使用一对{}括起来的代码称之为代码块;
📄 Java中可以使用**static**关键字修饰该代码块,使其成为静态代码块;
📄 静态代码块在类加载的时候加载;
