java学习
一.面向对象之多态
什么是多态:
多态是在继承/实现情况下的一种现象。表现为对象多态、行为多态。
对象多态:一个对象可以有多种身份,比如一个人,可以是一个父亲,一个老师,或者等等。
行为多态:都是同一个身份但是表现的能力不同,比如一个人,有的跑得快,有的跑得慢。
实现多态的必要条件:
- 必须在继承体系下
- 子类必须要对父类中方法进行重写
- 通过父类的引用调用重写的方法
向上转型+多态举例
向上转型就是创建一个子类对象,将其赋值给一个父类类型的引用变量。
这是由于Java的继承机制,子类对象具有父类对象的所有特征,所以可以通过将子类对象赋值给父类类型的引用变量来实现向上转型(从小范围转向大范围)。这种转型的好处是可以实现代码的复用和多态性。
语法格式:父类类型 对象名 = new 子类类型()
为了介绍向上转型,我们要先写几个生动形象的类来做基础以帮助理解:
父类的定义
public class people {
public void print()
{
System.out.println("我是人");
}
}
子类继承加重写
public class doctor extends people{
@Override
public void print()
{
System.out.println("我是医生,跑得不快也不慢");
}
}
public class teacher extends people{
@Override
public void print()
{
System.out.println("我是老师,跑得慢");
}
}
public class student extends people{
@Override
public void print()
{
System.out.println("我是学生,跑得快");
}
}
调用
public static void main(String[] args) {
people p1=new student();
p1.print();
people p2=new doctor();
p2.print();
people p3=new teacher();
p3.print();
}
在上面我们看到,一个people对象可以有学生对象、老师对象和医生对象,因为这三者都是人,这种叫做对象多态。
在我们调用它们的方法时可以看到,它们的跑步速度有着快慢的不同,这个叫做行为多态。
我们先看一下运行结果
通过上面例子我们知道,一个对象又包含几种不同的对象,在同一对象中,它们的行为又不同。
可以很好的了解到多态的意义。
那么我们为什么要用多态这种方式写代码呢?
多态的好处
- 代码的灵活性:通过多态,可以将方法的调用与具体对象的类型解耦,使得程序更加灵活。
- 可扩展性:通过添加新的子类,可以方便地扩展程序的功能,而无需修改现有的代码。
- 代码的简洁性:多态使得代码更加简洁,减少了重复的代码量。
二.static关键字
static可以用来修饰类的成员方法、类的成员变量、类中的内部类,另外可以编写static代码块来优化程序性能。
使用
1. 静态变量(类变量):
- 静态变量属于类而不是类的实例,因此无论创建了多少个类的实例,静态变量在内存中只有一份副本。
- 静态变量可以通过类名直接访问,无需创建类的实例。
- 通常用于表示类的共享状态或常量值。
class Counter {
static int count = 0; // 静态变量,表示计数器
void increment() {
count++;
}
}
2. 静态方法:
- 静态方法属于类而不是类的实例,可以通过类名直接调用,无需创建类的实例。
- 静态方法内部不能直接访问类的非静态成员,只能访问静态成员。
class MathUtils {
static int add(int a, int b) {
return a + b;
}
}
3. 静态代码块:
- 静态代码块是用
static
关键字声明的代码块,它在类加载时执行,并且只执行一次。 - 静态代码块通常用于执行类的初始化操作,例如初始化静态变量。
class MyClass {
static {
System.out.println("hello");
}
}
4. 静态内部类:
- 静态内部类是定义在另一个类内部且被声明为
static
的类。 - 静态内部类不持有对外部类实例的引用,因此它可以直接访问外部类的静态成员。
class Outer {
static class Inner {
void display() {
System.out.println("班级");
}
}
}