重写:就是父子类集成的时候,子类使用和父类相同的函数或者成员变量,将会使用子类的各类成员变量或者函数,隐藏父类的。如果还是想要使用父类的可以用super去调用
![a0d7265bc30f4718ad8c05c3e1a927a1.png](https://i-blog.csdnimg.cn/blog_migrate/bfdaa425ff08d6301daf37d6df11a2b4.png)
重写是 Parent P = new Parent()
不要把函数重载理解为多态。
因为多态是一种运行期的行为,不是编译期的行为。
多态:父类型的应用可以指向子类型的对象
比如 Parent P = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,去调用子类的该同名方法。
(注意此处,静态 static 方法属于特殊情况,静态方法只能继承,不能重写 override,如果
子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的
引用,则调用谁的版本)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将
P 转换为子类 Child 类型的引用。
Child a = (Child) p;
因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。
这个时候需要进行向下的类型转换,将父类引用转换为子类的引用。
例子:
public class PolyTest
{
public static void main(String[] args)
{
//向上类型转换
Cat cat = new Cat();
Animal animal = cat;
animal.sing();
//向下类型转换
Animal a = new Cat();
Cat c = (Cat) a;
c.sing();
c.eat();//编译错误
//用父类引用调用父类不存在的方法
//Animal al = new Cat();
//al.eat();
//编译错误
//向下类型转换时只能转向指向的对象类型
//Animal a2 = new Cat();
//Cat c2 = (Dog)a2;
}
}
class Animal
{
public void sing()
{
System.out.println(“Animal is singing!”);
}
}
class Dog extends Animal
{
public void sing()
{
System.out.println(“Dog is singing!”);
}
}
class Cat extends Animal
{
public void sing()
{
System.out.println(“Cat is singing!”);
}
public void eat()
{
System.out.println(“Cat is eating!”);
}
}例子的执行结果:
Cat is singing!
Cat is singing!
Cat is eating
抽象类其实就是之前的继承重写的步骤,为了规范子类
如果抽象类中具有抽象方法,子类必须实现抽象方法(贼重要),这个过程叫实现,或称为重写父类抽象方法
抽象类也可以继承抽象类,如果子类也是抽象类,那么该子类抽象类不必要重写父类的抽象方法,但如果有实现类继承了抽象类,必须实现抽象类的抽象方法以及抽象类父类的所有抽象
1、抽象类不能直接用new 对象()去创建。
2、抽象类必须使用abstract修饰符去修饰。
3、抽象类可以有普通的方法。
4、抽象类中的抽象方法使用abstract修饰符修饰,抽象方法没有方法体。
5、抽象类中的抽象方法交给子类去实现。
6、抽象类会被间接创建,因为在创建子类对象时先创建的是父类对象,这样抽象类作为父类会被间接的实例化,所以抽象类也有构造器。
注意:abstract只能修饰对象成员,不能修饰静态成员,抽象方法权限修饰符不能为private,final。
Java 抽象类 | 菜鸟教程,直接看这个
抽象类里面的方法域、修饰符可以理解和普通类一样,可以没有抽象方法,可以有抽象方法,抽象方法和普通方法就是没有方法体而已,然后子类必须重写抽象方法,普通方法不用重写
接口:
接口是一种特殊的抽象类,是Java提供的一个重要的功能,与抽象类不同的是:
- 接口的所有数据成员都是静态的且必须初始化。
- 接口中的所有方法必须都是抽象方法,不能有一般的方法。
[public] interface 接口名称 [extends 父接口名列表]
{
[public] [static] [final]数据类型 成员变量名 = 常量;
...
[public][abstract]返回值数据类型 方法名(参数表);
...
}
接口里面可以包含普通的方法实现默认用defalut修饰也可不写,也可有静态方法和方法体了。,也可以用private修饰符。口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。看起来就和普通方法一样,只是没有方法体,有方法体的其实就是defalut修饰的(也是默认不写)
基本上快和抽象类差不多了
一般使用匿名类来调用接口:
![](https://i-blog.csdnimg.cn/blog_migrate/b8c61ca1257e7e87325022765e5771fe.png)
还有安卓中:
![](https://i-blog.csdnimg.cn/blog_migrate/1a5db311866c870e6bf86951b143bffe.png)
不用匿名类则是:
![](https://i-blog.csdnimg.cn/blog_migrate/9436c43c0ff3364ca7039511fe7c9e01.png)
![0f3da3c2afde4a09a35ccd81ede34445.png](https://i-blog.csdnimg.cn/blog_migrate/d89cb9e9d37f06855335d21031d788b2.png)
数据结构:枚举、list、map等:Java 数据结构 | 菜鸟教程,注意格式,枚举是一种特殊的类
![](https://i-blog.csdnimg.cn/blog_migrate/62ada570fb79d3e5a613fc1531acde7b.png)
都是类哦
泛型:Java 泛型 | 菜鸟教程
![](https://i-blog.csdnimg.cn/blog_migrate/a7585c9ed54a66ecc22f985dc573eeb5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/43ed08a75cb12c153cd63e4887e8bc7c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cc191ba781cd81417ea06a7830d15c4e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8754a9927f1c6ece9ef534fe3e525d77.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3389a743ca3e38e23f811982ab6d56c7.png)
序列化是一种用于保存、传输和还原对象的方法,它使得对象可以在不同的计算机之间移动和共享,这对于分布式系统、数据存储和跨平台通信非常有用。Java 序列化是一种将对象转换为字节流的过程,以便可以将对象保存到磁盘上,将其传输到网络上,或者将其存储在内存中,以后再进行反序列化,将字节流重新转换为对象。
![](https://i-blog.csdnimg.cn/blog_migrate/971e3801368c822bca62d2ef172bf527.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e88f3109c477cadd6569b6f066750af1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ec9be865843dd4629f7c46769cb146d6.png)
序列化:Java 序列化 | 菜鸟教程
java语法的各种例子:Java 实例 | 菜鸟教程