浅谈面向对象之封装继承多态!如何使用内部类模拟多继承
Posted cuteboy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈面向对象之封装继承多态!如何使用内部类模拟多继承相关的知识,希望对你有一定的参考价值。
【属性的封装】
(1.)将属性进行私有化处理,不允许外部程序进行直接访问,并对外提供统一的方法,用于设置和读取私有属性;
(2.)实现访问控制,限制属性访问,但不是拒绝访问。
作用:只能通过规定的方法访问数据,方便在方法中加入控制语句,防止不合法数据赋值。
【封装】
(1.)除了属性的封装之外,将需要重复使用的代码提取到方法中,这叫方法的封装;将相同的属性和方法抽象成一个类,这也是封装思想。
【方法的重载】
(1.)在同一个类中,方法名相同,参数列表不同,与返回值和访问修饰符无关的多个方法,构成方法重载
(2.)参数列表:参数的个数,数据类型,多个参数的前后顺序不同,都属于参数列表不同
(3.)方法重载的典型应用:构造函数重载
【继承】
(1.)子类继承父类,使用extends关键字
(2.)子类中需要访问父类成员,使用super关键字。
super.属性 访问父类属性
super.方法() 访问父类方法
如果,子类中没有同名的属性和方法覆盖到父类,则依然可以直接使用this.属性调用从父类中继承的非私有属性。
但是,如果子类中重写了与父类同名的属性,this.属性 访问的是本类, super.属性访问的父类属性
在子类构造函数中,使用super(); 表示调用的父类的构造,而且,super()函数必须在子类构造的第一行。
注意: 即使使用super关键字,也不能访问父类的私有属性和方法。
(3.)子类可以访问父类的哪些属性和方法:
private 本类
默认省略 本类 同包
protected 本类 同包 非同包子类(用extends实现继承,实例化子类,子类调用父类属性或方法)
public 本类 同包 非同包子类 其他任何包都能用
(4.)继承后的初始化顺序(了解):
父类属性------->父类构造-------->子类属性>------------->子类构造
(5.)在java中,继承只能单继承,不能多重继承,但是可以多层继承
public class Test1{}
public class Test2 extends Test1{}
public class Test3 extenfs Test2{}
此时,Test3就可以得到Test1和Test2两个类的非私有属性
(*******子类继承父类,子类中重写构造方法,super(属性);******)
【方法重写】
(1.)在子类中,重写方法。要求:方法名相同、参数列表相同、返回值相同、访问控制符不能比父类更严格。
(2.)override和overload的区别:
位置 方法名 返回值 参数列表 访问控制符
override方法重写: 子类 相同 相同 相同 不能与父类更严格
overload方法重载: 本类 相同 无关 不同 无关
注意: 由于子类无法继承父类的私有属性,因此父类中的private方法无法被重写
【抽象类】
(1.)抽象类:使用abstract关键字修饰的类,称为抽象类; public abstract class Instrument{}
抽象类不能被实例化;
(2.)抽象方法:使用abstract关键字修饰,而且没有方法体的方法称为抽象方法。 public abstract void play();
(3.)子类继承抽象类,那么子类必须重写父类所有抽象方法。
除非子类也是抽象类。
(4.)抽象方法必须写在抽象类中;抽象类中方法不一定是抽象方法。
【final 关键字】
(1.)final修饰的类,为最终类不能被继承;
(2.)final修饰的方法,为最终方法,不能被重写
(3.)final修饰 的变量,成为常量,不可被修改,常量所有字母全部大写; private final int AGE=20;
【static 关键字】
(1.)static 可以用于修饰方法、属性、代码块;
(2.)static修饰的方法和属性称为类属性和类方法,也叫静态属性和静态方法。
public static String name="zhangsan";
(3.)静态属性和静态方法,使用时可以使用类名直接调用,也可以使用对象名调用:
Person.name; //类名直接调用
p.name; //使用对象名调用
而成员属性和成员方法,也叫实例属性和实例方法,只能使用对象名调用。
(4.)类属性和类方法,是属于类的,在类装载的时候直接声明;
成员属性和成员方法,是属于对象的,在对象实例化时才能产生;
所以,静态属性和静态方法将先于非静态属性方法产生。
所以,静态方法中不能调用非静态属性和方法。(静态方法产生时,还没有对象,也自然没有成员属性和方法)
非静态方法中可以调用静态属性和方法。
另外,静态方法中不能使用this和super。(this代指本类对象,super代指父类对象,所以产生静态方法时,还没有对象)
(5.)由于类属性和类方法,时属于类的。因此,只会在装载的时候产出一份。
也就是说,一个类的静态属性,只能在类装载的时候产生一份,后续使用该类实例化的多个对象将公用同一个静态变量。
【多态】
(1.)多态:同一种事物,由于条件的不同,展示出不同的结果;
(2.)程序中的多态:同一个引用类型,由于使用不同的对象实例,而执行不同的操作。
实例:
Chinese c=new Chinese(); c.say();
English e=new Englisn(); e.say();
中国人说中国话英国人说英语,这不叫多态。
Person p=new Chinese(); p.say();
Person p=new English(); p.say();
同样是人,有人说中国话,有人说英国话,这是多态。
(3.)实现多态的条件:
子类继承父类;
子类重写父类方法;
父类引用指向子类对象 ---------------保证了同一个父类引用类型,使用不同的子类对象实例,而执行不同的操作。
【父子类转型】
(1.)向上转型:子类转成父类,自动转换
Person p=new Chinese();
特点:绝对安全;子类独有的属性和方法将会丢失,只能调用父类中存在的属性和方法。
如果父类方法不是抽象方法,那调用时,执行的方法体依然是子类的 ,
典型应用:多肽中父类引用指向子类对象。
(2.)向下转型:父类转成子类,强制转换。
Person p=new Person();
chinese c=(Chinese)p;
//ClassCastException 类转换异常,因为p不是chinese的实例,强转会造成类转换异常
Person p=new English();
chinese c=(Chinese)p;
//ClassCastException 类转换异常,因为p不是chinese的实例,强转会造成类转换异常
Peeson p=new Chinese();
chinese c=(Chinese)p;
// 正确,因为p是chinese的实例
特点:不安全,可能造成ClassCastException ,可以使用instanceof提前判断。
if(p instanceof Chinese){
Chinese c=(Chinese)p;
}
【使用内部类模拟多继承】
以上是关于浅谈面向对象之封装继承多态!如何使用内部类模拟多继承的主要内容,如果未能解决你的问题,请参考以下文章