DAY14-继承、方法重写、包、权限修饰符、状态修饰符
继承:(面向对象三大基本特征之一)
概述:
两个类中有相同的成员变量和成员方法(相同特征)
继承是面向对象的三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
格式:
public class 子类名 extend 父类名{
父类又称为基类和超类
子类又被称为派生类
特点
子类可以有父类的内容
子类也可以有自己特有的内容
继承的好处和弊端
好处
提高了代码的复用性(多个类相同的成员可以放在同一个类中)
提高了代码的维护性(如果方法代码需要修改,修改一个类即可)
弊端
继承类与类之间产生了关系,增强了类的耦合性,父类改变时,子类不得不发生改变,降低了子类的独立性
什么时候使用继承:
继承的的关系: is a(什么是什么的一种)
例如:
苹果是水果的一种,可以的水果设计为父类,苹果设计为子类
继承中变量访问特点:
在子类中访问一个变量
1.在子类局部范围查找
2.子类成员范围查找
3.父类成员范围查找
4.都找不到就报错(这里不考虑父类的父类)
this:当前类的对象
super:当前类父类的对象
关键字 | 访问成员变量 | 访问成员方法 | 访问构造 |
---|---|---|---|
this | this.成员变量 | this.成员方法(…) | this(…) |
super | super.成员变量 | super.成员方法(…) | super(…) |
继承中构造的访问特点
子类中所有的构造都会默认先调用父类的无参构造
为什么?
因为子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化之前,一定先初始化父类
每个子类构造方法中默认第一条语句都是super();
如果父类中没有无参构造,只有有参构造怎么办?
通过super关键字调用父类有参构造
在父类中手动添加无参构造
注意:在使用有参构造时,把无参构造加上肯定没问题
方法重写:
概述:
子类中出现和父类中一模一样的方法声明
应用:
当子类需要父类的功能时,而子类有自己特定的内容,可以重写父类 中的方法,这样,即使用了父类的功能,也是实现了子类特有的内容
方法重写为了区别子类中的方法是否实现了方法重写,Java提供了@Override来进行区分
@Override:
注解:
帮助区分子类中方法是否方法重写
特点:
1.继承 不同类
2.方法相同(方法名,参数,返回值)
注意:
1.private修饰的方法不能被重写
2.子类中的方法权限访问修饰符,不能被父类低
继承中注意事项:
- 1.不支持多继承,只能单继承
- 2.支持多层继承
- 3.private修饰的不能被继承
- 4.构造不能被继承,只能被使用
包
概述:
本质就是文件夹
对类进行分类管理
作用:
使用格式
格式:package 包名;(多级包使用.分割)
范例:package com.shujia;
注意:
包的路径从src下第一级目录开始到当前类的所在目录
导包
概述和使用:
使用不同包下的类,要写类的全路径,太繁琐,为了方便操作,Java提供了导包的功能
导包格式
格式:import 包名.类名;(多级包使用.分割)
范例:import java.util.Scanner;
注意:
包的路径从src下第一级目录开始到当前类的名称;
只能在同一个项目下
权限修饰符
修饰符 | 同一个类中 | 同包 | 不同包,子类 | 不同包,非子类 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default | √ | √ | ||
private | √ |
举个例子
package Day14.demo10;
public class Person {
public int age=20;
protected int age1=18;
int age2=25;
// 同类
public void show(){
System.out.println(age);//同类public可用
System.out.println(age1);//同类 protected可用
System.out.println(age2);//同类default 可用
}
}
package Day14.demo10;
public class Test {
public static void main(String[] args) {
Person person = new Person();
// 同包
System.out.println(person.age);//同包public可用
System.out.println(person.age1);//同包 protected可用
System.out.println(person.age2);//同包default 可用
}
}
package Day14.demo11;
import Day14.demo10.Person;
public class Student extends Person {
// 不同包子类
public void show(){
System.out.println(age);//不同包 子类 public可用
System.out.println(age1);//不同包 子类 protected可用
// System.out.println(age2);
}
}
package Day14.demo11;
import Day14.demo10.Person;
// public 同类 同包 不同包子类 不同包非子类 都可以用
// protected 同类 同包 不同包子类 都可以用
// default 同类 同包 都可以用
public class Test {
public static void main(String[] args) {
Person person = new Person();
// 不同包非子类
System.out.println(person.age);// 不同包 非子类 public可用
// System.out.println(person.age1);
// System.out.println(person.age2);
}
}
▶▶▶状态修饰符最常用的还是public,private
状态修饰符
final(最终态):
可以修饰成员变量,成员方法,类
特点:
修饰变量:该变量的值,不能被修改,必须初始化
修饰方法:该方法可以被重载,不能被重写
修饰类:该类,不能被继承
注意:修饰引用数据类型时,是地址值不能改变,地址所标识空间中的内容可以改变
总结:final修饰不能被修改重写继承
static(静态):
可以修饰成员变量,成员方法
特点:
被类的所有对象共享
也是判断是否使用static的条件
修饰的成员变量,成员方法可以通过类名直接调用
共享的情况
通过类名直接调用
注意:静态成员方法只能访问static修饰成员变量和成员方法,因为static修饰的成员是在类加载时加载
|
|
|
|
|
上一章节-DAY13-ArrayList集合和装拆箱
下一章节-DAY15-多态和抽象类
天天更新不容易,随手点个小赞👍,你说是吧,吴彦祖!O(∩_∩)O