java类的四大基本特性

本文探讨了Java的面向对象特性,包括抽象、封装、继承和多态。重点讲解了抽象类与接口的区别,以及Java不支持多继承的原因。此外,还对比了Java与Python的区别,并阐述了面向过程与面向对象编程的优缺点。

面向对象的特性:抽象封装继承多态。其中封装、继承、多态是java的三大基本特性。

抽象
  抽象类:包含抽象方法的类称之为抽象类,但不意味着抽象类中只能有抽象方法,它和普通类一样,可以拥有普通的成员变量、方法。

  1. 抽象类不能被实例化。抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能
  4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法
  5. 被定义为abstract的类需要被子类继承,但是被修饰为final的类是不能被继承和改写的,这两者是不能一起用来做修饰的。

  接口:接口是一种特殊的抽象类。接口中的方法都是抽象方法,abstract默认不写,所以抽象类中的抽象方法不能用访问修饰符。接口中声明的成员默认为static final成员(不管是基础数据类型还是引用类型),且必须初始化。接口的特性:

  1. 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)
  2. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)
  3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

接口和抽象类的区别:

  1. 抽象类中的方法可以有方法体,但是接口中的方法不行
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的(隐式公有的)
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。【JDK1.8后,接口里面可以有静态方法和方法体了】
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口
  5. 抽象类有构造函数,而接口没有构造函数。

封装 :封装是面向对象三大核心中最核心的一个特性。封装就是将类的某些属性隐藏起来,然后通过接口对外开放,但是在外部不能直接进行查找属性。为什么要设置隐藏:
1、隐藏数据是为了限制外界对属性的直接修改
2、通过接口操作可以在接口上附加额外的逻辑处理来控制隐藏数据

继承
继承的特性:

  1. 子类拥有父类非 private 的属性、方法
  2. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
  3. 子类可以用自己的方式实现父类的方法
  4. Java 的继承是单继承
  5. 提高了类之间的耦合性

多态:多态是同一个行为具有多个不同表现形式或形态的能力。多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变。

多态的三个必要条件:1、继承 2、重写 3、父类引用指向子类对象
多态的实现方式:1、重写 2、接口 3、抽象类和抽象方法

一、使用父类类型的引用指向子类的对象
二、该引用只能调用父类中定义的方法和变量,而不能调用本身定义的一些方法。因为多态中强调:编写java程序时,引用类型变量只能调用其编译时类型的变量,不能调用其运行时类型变量
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法(动态绑定)

  重载与重写【重载是指一个类中可以有同样的修饰符,返回值,方法名,但参数个数或顺序不同的方法。而重写指的是子类继承父类后,重写父类的方法。重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。】

java为什么不支持多继承

  若子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量。若一个子类继承的多个父类拥有相同方法,同时子类并未覆盖该方法(若覆盖,则直接使用子类中该方法),那么调用该方法时将无法确定调用哪个父类的方法。
  先从Java 8之前说起。要区分“声明多继承”与“实现多继承”。Java是不允许“实现多继承”,简称不允许“多继承”。但是Java支持“声明多继承”——Java的接口的多继承——一个类可以实现多个接口(“继承”了多个接口上的方法声明),而一个接口可以继承多个接口(同样是“继承”了多个接口上的方法声明)。接口只允许有方法声明而不允许有实现,因而不会出现像C++那样的实现多继承的决议问题;抽象类可以有方法实现,但要遵循Java类的单继承限制,也避免了实现多继承的问题。这是早期Java为了与C++区分开的一个决定。
  然后,从Java 8开始,接口允许为方法提供“默认实现”了——默认方法(default method)。因而实质上Java 8的接口多继承其实也会涉及到实现多继承,并且语言层面有专门规定去解决实现多继承时选择哪个版本的问题——哪个都不选择,而是在发现会继承多个默认方法实现并且没有override时报错,逼使用户显式override可能冲突的方法。这使得Java 8开始接口可以当作traits来使用,达到实现多继承的目的。

java与Python区别

1、python虚拟机没有java强,java虚拟机是java的核心,python的核心是可以很方便地使用c语言函数或c++库。
2、Java是一种静态类型语言,Python是一种动态类型语言
3、Java中的所有变量需要先声明(类型)才能使用,Python中的变量不需要声明类型
4、Java编译以后才能运行,Python直接就可以运行
5、JAVA 的类型要声明,Python 的类型不需要
6、Python 有好多程序用的是面向过程设计方法,而java是面向对象的

面向对象和面向过程的区别

  面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面向过程:
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素
缺点:没有面向对象易维护、易复用、易扩展

面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值