1.封装
1.提高程序的安全性,保护数据
2.隐藏代码的实现细节,对外提供访问方式
3.统一接口
4.系统可维护增强了
2. 继承
继承的本质是对某一批类的抽象
提高了代码的复用性
让类与类之间产生了关系,给多态提供了前提
什么时候写继承?
事物之间存在着所属关系时,才继承。xxx是yyy中的一种。
super注意点
1.super调用父类的构造方法,必须在构造方法的第一个
2.super必须只能出现在子类的方法或构造方法中!
3.super和this不能同时调用构造方法!
this:本身调用这个对象(没有继承也可以使用)
super:代表父类对象的应用(只能在继承条件下可以使用)
继承的覆盖使用注意事项:
1,子类覆盖父类权限必须大于等于父类的权限
。public>protected>default>private
2,覆盖中,静态只能覆盖静态,或者被静态覆盖。
重写:需要有继承关系,子类重写父类的方法。子类必须与父
类一致,子类重写了父类的方法,执行子类的方法
为什么需要重写?
父类的功能,子类不一定需要,或者不一定满足
创建子类对象,父类中的构造函数也运行了。
为什么呢?
其实在子类的所有构造函数中的第一行,都有一句默认的super();在调用父类中的空
参数构造函数。
为什么子类实例化都必须去父类中的初始化呢?
因为子类继承了父类,只有了父类中的内容,所以子类在实例化使用父类中的内容之前,
必须要先明确父类是如何对自己的内容进行初始化的,
所以子类的构造函数都会默认访问父类中空参数的构造函数。通过super();
例:
class Fu extends Object
{
Fu()
{
//super();
//显示初始化。
//构造代码块初始化。
System.out.println("fu run...");
}
/**/
Fu(int x)
{
System.out.println("fu ..."+x);
}
}
class Zi extends Fu
{
Zi()
{
// super();
System.out.println("Zi run...");
}
Zi(int x)
{
this();
System.out.println("Zi ..."+x);
}
}
class ExtendsDemo4
{
public static void main(String[] args)
{
new Zi(4);
}
}
3.多态
某一事物的多种体现形态。
重点是对象的多态性。
多态在程序中的体现:父类或者接口的引用指向了自己的子类对象。
**多态的好处:**提高了代码的扩展性,后期出现的功能,可以被之前的程序所执行。
多态的弊端:虽然可以使用后期出现的代码,但是不能使用子类特有的功能。只能使用覆盖了父类的功能。
多态的前提:必须要有关系(继承,实现),通常会有覆盖操作。
Animal a = new Dog();//向上转型。什么时候用?需要提高程序的扩展性,隐藏具体子类型时。
Cat c = (Cat)a;//向下转型。什么时候用?当需要使用子类型的特有方法时。
Animal a = new Dog();//向上转型。什么时候用?需要提高程序的扩展性,隐藏具体子类型时。
Cat c = (Cat)a;//向下转型。什么时候用?当需要使用子类型的特有方法时。
不能重写的方法
1.static方法属于类,不属于实例
2.final 修饰 常量
3.private 修饰的方法
多态的调用方式在子父类中的特殊体现。
1,成员变量。
多态调用的时,编译和运行都参考引用型变量所属的类中的成员变量。
简单的说就是:编译和运行看等号的左边。
2,成员函数。
多态调用时,编译参考的是引用型变量所属的类,运行时参考的是对象所属类。
简单的说就是:编译看左边,运行看右边。因为函数有一个覆盖的特性。
3,静态函数。
多态调用时,编译和运行都参考引用型变量所属的类中的静态函数。
简单的说就是:编译和运行看等号的左边。
例
class Fu
{
// int num = 4;
void show()
{
System.out.println("fu run");
}
static void staticMethod()
{
System.out.println("fu static method");
}
}
class Zi extends Fu
{
// int num = 5;
void show()
{
System.out.println("Zi run");
}
static void staticMethod()
{
System.out.println("Zi static method");
}
}
class DuoTaiDemo4
{
public static void main(String[] args)
{
/*
静态函数,静态绑定到所属类上。
*/
Fu f = new Zi();
f.staticMethod();
Zi z = (Zi)f;
z.staticMethod();
/*
//成员函数。动态绑定到当前对象上
Fu f = new Zi();
f.show();
*/
/*
//成员变量
Fu f = new Zi();
Zi z = (Zi)f;
System.out.println(f.num);//4
System.out.println(z.num);//5
*/
}
}