写本篇博客的目的旨在个人复习巩固知识,方便自己在线阅览。
1.this 关键字
this 修饰的变量用于指代成员变量
- 方法的形参如果与成员变量同名,不带 this 修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带 this 修饰的变量值的是成员变量
什么时候使用 this?
- 解决局部变量隐藏成员变量
this:代表所在类的对象引用
- 即方法被哪个对象调用,this 就代表哪个对象。
2.继承
2.1.继承概述
继承的格式
- 格式:public class 子类名 extends 父类名{}
- 范例:public class Zi extneds Fu{}
- Fu:是父类,也被称为基类、超类
- Zi:是子类,也被称为派生类
继承中子类的特点
- 子类可以有父类的内容
- 子类还可以有自己特有的内容
2.2.继承的好处和弊端
继承的好处
- 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
- 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
继承的弊端
- 继承让类与类之间产生了关系,类的耦合性增强了。
- 当父类发生变化时,子类实现也不得不跟着发生变化,削弱了子类的独立性。
什么时候使用继承?
- 继承体现的关系:is a
- 假设法:有俩类: A 类 和 B 类。
若满足 A 是 B 的一种,或 B 是 A 的一种,则说明二者间存在继承关系。
此时可以考虑使用继承来体现,否则不可滥用继承。 - 举例:苹果和水果,猫和动物,猫和老鼠
2.3.继承中变量的访问特点
在子类方法中访问一个变量
- 子类局部范围找
- 子类成员范围找
- 父类成员范围找
- 若都没有,则报错(不考虑父类的父类 …)
2.4.super 关键字
super 关键字的用法和 this 关键字的用法相似
- this:代表本类对象的引用。
this 关键字指向调用该方法的对象,
一般我们是在当前类中使用 this 关键字,
故我们常说 this 代表本类对象的引用。 - super:代表父类存储空间的标识。
可以理解为父类对象引用。
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
---|---|---|---|
this | this.成员变量 访问本类成员变量 |
this(…) 访问本类构造方法 |
this.成员方法(…) 访问本类成员方法 |
super | super.成员变量 访问父类成员变量 |
super(…) 访问父类构造方法 |
super.成员方法(…) 访问父类成员方法 |
2.5.继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法
- 因为子类会继承父类的数据,可能还会用到父类的数据。
故子类初始化前,必先无参父类数据的初始化。 - 每一个子类构造方法的第一句默认都是:super()
若父类中没有无参构造方法,只有带参构造方法,该怎么办?
- 通过使用 super 关键字去显示调用父类的带参构造方法
- 自己在父类中提供一个无参的构造方法
推荐:自己在父类中给出无参构造方法。
2.6.继承中成员方法的访问特点
通过子类对象访问一个方法
- 子类成员范围找
- 父类成员范围找
- 若以上都没有就报错(不考虑父类的父类…)
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.状态修饰符
- final(最终态)
- 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.接口名作为形参和返回值
- 方法的形参是接口名,其实需要的是该接口的实现类对象
- 方法的返回值时接口名,其实返回的是改接口的实现类对象