浅谈面向对象之封装、继承、多态!如何使用内部类模拟多继承

coding

【属性的封装】

(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;

}

 

【使用内部类模拟多继承】

 

 

以上是 浅谈面向对象之封装、继承、多态!如何使用内部类模拟多继承 的全部内容, 来源链接: utcz.com/z/509463.html

回到顶部