【Java基础】面向对象特性

面向对象的特征

面向对象的主要特征包括:抽象,继承,封装,多态
1. 抽象:忽略主题中与当前目标无关的方面,值注意与目标有关的方面(抓住主要矛盾或者主要特征),包括数据抽象和过程抽象
2. 继承:用于表述类的共性,是一种联结类的层次模型
3. 封装:将客观事物抽象为类,每个类对自身的方法和数据进行保护。通过权限修饰符确定哪些属性或方法可以被外界访问
4. 多态:允许不同类的对象对同一个消息做出响应

继承的特性以及继承和组合的区别

继承:使用extern实现,使得子类拥有和父类一样方法和变量,主要特性:
1. Java不支持多继承
2. 子类只能继承父类的非私有(public protected)的成员变量和方法
3. 子类成员变量和父类成员变量同名的时候,父类成员变量会被覆盖
4. 子类的成员方法和父类成员方法签名相同(方法名以及参数表相同)的时候,父类的成员方法也是被覆盖

组合是在新类里面创建原有类的对象,重复使用已有类的功能。组合是经常被使用到的,只是很少注意到。
组合和继承的区别:组合通常也被看做是has-a关系而继承被看做是is-a关系

Java中多态实现机制

  1. 方法重载: 重载是指同一个类有多个同名方法,但是方法的参数表不同。由于参数不同,在编译期就可以确定到底是使用哪一个方法,因此属于编译时多态
  2. 方法覆盖:子类覆盖父类方法,也就是同样的方法在子类和父类中是具有不用的逻辑的。基类的引用型可以指向基类对象和子类对象,接口引用型可以指向其实现类变量。程序在编译的时候并不能确定到底是调用哪一个方法,因此只有执行期的时候才可以动态绑定(将方法调用和方法主体联系起来)。由于只有在执行期才能知道到底执行哪个方法,因此方法覆盖实现的多态称为运行时多态

Java中重载和覆盖的区别

重载是在一个类中的多态性,通过在一个类中定义同名方法实现。(子类继承父类方法后也是而已对继承的方法进行重载,但是private 修饰的方法不能被子类重载,因为子类无法继承该类;不能通过返回值或访问权限或异常抛出类型来实现重载)。

覆盖是派生类和基类之间的多态。同样基类中private方法不能被覆盖(无法被继承);子类实现覆盖,必须保证方法名,返回值,参数表,抛出异常类型是一致的。

两者的区别:
1. 覆盖是子类和父类之间,垂直关系;重载是类中方法之间的关系,水平
2. 覆盖需要参数列表是一样的而重载需要时不一样的
3. 覆盖是通过调用者的不同来区别的,而重载是根据调用时的参数不同来区别的

抽象类与接口

抽象类:一个类中包含抽象方法就称为抽象类,通过abstract关键字实现。只要包含了抽象方法的类就必须声明为抽象类,抽象类被实现的时候,访问权限必须相同或者更低(public -> protected -> private),抽象类不能实例化
接口:抽象方法的集合,方法都是没有方法体的,通过interface关键字实现。接口可看做是抽象类的特例,所有方法都是抽象的。

相同点:
1. 都不能被实例化
2. 子类或者实现类都只有在实现了所有的抽象方法之后才可以被实例化

不同点:
1. 接口只有方法定义没有实现,抽象类既可以有方法的定义也可以有方法的实现
2. 一个类可以实现多个接口但是只能继承一个抽象类
3. 接口强调特定功能的实现,是has-a关系,而抽象类强调所属关系,是is-a关系
4. 接口中的变量默认是public static final,且只能有静态final的成员变量,且必须被赋值,方法必须是public abstract。而抽象类就和普通类类似,但是抽象类的抽象方法不能被private, static, synchronized, native等修饰。

抽象类多用于在同类事物中有无法具体描述的方法的时候以及子类和父类存在一定的层次结构的时候使用;而接口多用于不同类之间,所以用于需要支持差别较大的两个或者更多对象之间的特定的交互行为时使用。

补充:
接口可以继承抽象类,抽象类可以实现接口;抽象类可以继承具体类

内部类

定义在一个类的内部的类型称为是内部类,内部类可以看做是一个类的成员(可以被等价看做外部类的一个成员变量)。
分类:
1. 静态内部类:class outer{ static class inner{}}
2. 成员内部类: class outer{ class inner{}}
3. 局部内部类: class outer{ public void func(){class inner{} } }
4. 匿名内部类: class outer{ public void func(new anonymousInner(){ … }); }

静态内部类如同一个类的静态属性一样,不依赖与类的实例而进行实例化。静态内部类不能与外部类名字相同,不能访问外部类的非静态成员,只能访问外部类的静态成员或方法(包括private)。

成员内部类可以自由引用外部类的成员变量和方法;不可以定义静态属性或者方法;只有外部类被实例化了之后成员内部类才可以被实例化。

局部内部类是一个代码块内的类,作用范围也仅仅限于该代码块(类似局部变量);不能被public, protected, private 和static修饰。只能访问方法中的final类型的局部变量。如果局部内部类位于外部类的静态方法或者一个静态代码段中,那么就称为局部静态内部类,如果是普通的方法中或者非静态代码段中就称为是局部内部类。

匿名内部类是没哟名称的内部类,不使用extends class implements。没有构造函数,通过集成其他类或者实现接口(大多使用的是这种,尤其是AndroidUI开发中)。必须跟在new的后面,匿名内部类也属于是局部内部类。

Java中的this和super

Java中this 用来指向当前实例对象,重要的一个功能就是区分成员变量与方法形参(比如当构造方法的形参和成员变量同名的时候就需要this帮忙了)

super可以用来访问父类的方法和成员变量(比如子类的方法或者成员变量覆盖了父类的同名方法和成员变量的时候,如果在子类中需要访问父类中被覆盖掉的同名方法或者成员变量,就需要使用super)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值