文章目录

  • 一、Java语言的面向对象特性
  • 二、类的定义
    • 1.类定义的方式
    • 2.Java方法参数传递的方式
    • 3.可变参数列表
    • 4.方法重载
    • 5.构造方法
    • 6.this关键字
    • 7.访问控制
  • 三、类的继承
    • 1.继承的基本概念及方式
    • 2.子类对象的创建
    • 3.方法覆盖/重写(override)
    • 4.super关键字与this关键字的区别
    • 5.对象类型转换

一、Java语言的面向对象特性

Java语言是一门面向对象的语言,和其他面向对象语言一样,Java面向对象语言有以下三个特征:

  1. 封装:在面向对象语言中,我们操作的是一个又一个对象。这些对象的数据与操作数据的方法会被封装到特定的类里面,我们在使用的时候不需要关心该对象的某些方法是如何实现的,只需要调用类提供的接口即可使用这些方法。这就是封装的含义。
  2. 继承:当一个类是另一个类的特例时,我们可以让这个特例的类去继承另一个类,这样,这个特例的类被称作子类,而继承的类被称作父类。这样子类不仅能有父类的特性,还可以有自己的额外扩展,这就是继承的含义。
  3. 多态:多态的含义可以表达为“对外提供一个接口,内部可以有多种实现”。
    封装、继承和多态在下面都会详细介绍到!

二、类的定义

1.类定义的方式

Java中类的定义使用到的关键字是 class ,类体中主要定义的是:成员变量、成员方法、构造方法和初始化块。下面以日期类示例,演示一下类的定义方法:

//类名为Date,访问限定符为public
public class Date {/*** 分别定义成员变量year、month、day* 且均设置为私有变量,即只能在类内部访问,外部无法访问*/private int year;private int month;private int day;//带参构造方法,对成员变量进行初始化public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}//打印日期public void printDate(){System.out.println(year+":"+month+":"+day);}
}

Java语言类的成员变量声明时,可以使用如下修饰符的组合:

  • 访问权限符:public(公有)、private(私有)、protected(保护)
  • 常量声明:final
  • 静态声明:static

另外,需要说明的是,成员变量是定义在类中的,作用范围是整一个类;局部变量是定义的在方法中的,作用范围从该变量的说明开始到包含该变量的块体结束为止,不允许同名局部变量的作用范围重叠(如果局部变量与成员变量同名时,在方法中局部变量优先)。
例如:下述代码中x的输出结果就应该是1而不是0

2.Java方法参数传递的方式

Java方法的参数传递方式和C/C++是不一样的,首先是基本类型的参数传递:
如果实参和形参都是基本数据类型,那么实参向形参传递时,是直接将自己的值赋给形参,并且在这个赋值过程中,可以进行自动类型转换。

而引用类型的参数传递是:
如果实参和形参是引用类型的参数,实参其实保存的是某个对象的地址,实参将自己的值赋给形参本质上就是将这个对象的地址给形参,所以,实参和形参引用的是同一个对象实体!

我们可以通过下面的例子来进一步理解一下这个概念:
下面的这个例子分别有两个方法:changeCylinder和changeMember,前者方法是重新new一个新的对象并将这个对象赋给形参,而后者方法是就在原来形参的基础上改变成员变量的值。

这道题其实就很明显了,cy1调用的是changeCylinder方法,形参一开始获得的是cy1对象的地址,但在方法内部又新创建了一个对象,因此形参后来指向的是新对象的地址,并不是cy1对象的地址,所以cy1对象原来的值并没有改变,最后输出的radius和height都是1.
而cy2调用的是changeMember方法,方法内部直接对成员变量做修改,由于此时形参保存的是cy2对象的地址,因此实际上是修改cy2对象中成员变量的值,所以最后输出的radius和height都是10.0

3.可变参数列表

在Java5中引入了方法的可变参数,可以接受类型相同但个数不定的参数。下面以代码的形式演示一下可变参数列表:

public int max (int... numbers){if (numbers.length == 0){throw new IllegalArgumentException("参数个数要大于0!");}int result = numbers[0];for (int x : numbers){if (x > result){result = x;}}return result;}

对于可变参数列表,有以下几点说明需要注意:

  • 可变参数必须位于形参的最后一项
  • 可变参数接受的参数个数可以是0个或者n个
  • 可变参数在方法中以数组的形式调用

4.方法重载

方法重载非常的简单,就是一个类中存在2个或者更多个具有相同的方法名称但不同的形参列表的方法。
方法重载需要注意:

  • 方法的形参表必须不同:包括形参的个数不同、形参的类型不同、不同类型的形参的排列顺序不同(三者满足其一即可,当然也可同时满足)
  • 方法的修饰符、返回类型可以相同也可以不同
  • 构造方法、实例方法和静态方法均可以重载

5.构造方法

构造方法是类里面一种特殊的方法,在创建对象时调用,用于初始化对象的数据域变量。我们上面写的日期类里,这个就是构造方法:

对于构造方法,有以下说明:

  • 构造方法必须与所在的类有相同的名字
  • 构造方法不能声明返回类型,连void都不可以有
  • 当类中没有明确声明构造方法时,隐含声明一个方法体为空的无参构造方法,称为“默认构造方法”
  • 一个类可以有多个构造方法,通过方法重载来实现。
  • 如果没有人为地写构造方法,会有默认构造方法,该默认构造方法没有任何参数。

6.this关键字

this关键字在类中使用,可以调用类的成员变量和类的成员方法,this关键字有以下注意:

通过this关键字在构造方法里调用本类地其它构造方法时,必须在构造方法地第一句。

每个构造方法和实例方法中都隐含一个this引用。

7.访问控制

访问权限是指限制在一段代码中能否访问同一个类或类的成员,Java有四种访问控制:

  1. private:访问范围是私有范围,即被修饰目标所在的类中可以访问
  2. 不使用任何访问权限修饰符(默认):访问范围是包范围,即被修饰目标同一包的任何类中访问
  3. protected:访问范围是包范围+修饰目标所在类的所有子类
  4. public:访问范围是公开范围,即应用程序中任何位置均可访问

三、类的继承

1.继承的基本概念及方式

继承是指在面向对象程序设计中,可以从已有的类中派生出新的类,这个已有的类一般被称为父类,派生出来的新类一般被称为子类。

事实上,Java程序中的每一个类均显式或隐式地派生子一个已存在的类。如果没有指明来源的类隐含由 Java.lang.Object 派生,它是Java程序中所有类的公共起源,它自身没有继承其它类。
下图演示的就是Java中类继承地语法:

子类不继承父类地构造方法和不可访问的成员(如private成员),但是可以通过特定方式间接使用他们。

2.子类对象的创建

父类的构造方法虽然不被继承,但子类构造方法必须调用父类构造方法,调用的方式需要用到super关键字:super(参数)
关于这个调用方式,有以下注意:

  • super(参数) 必须是子类构造方法地第一条语句,如果第一条语句不是这个的话,编译器会默认把 super() 作为子构造方法地第一条语句(即默认调用父类的无参构造方法)
  • 构造方法第一条语句如果是 this(参数) 时,不需要 super()super(参数)

3.方法覆盖/重写(override)

我们在什么情况下需要用到子类对父类方法的重写呢?
当父类和子类中有相同的方法,但是其实现(方法体)不同时。下面我们用Student类继承Person类,Student类重写Person类的introduce方法示例演示一下重写:

Person类

public class Person {private String name;private int age;public Person(){}public Person(String name,int age){this.name=name;this.age=age;}public void introduce(){System.out.println("姓名:"+name+",年龄:"+age);}public void setAge(int age) {this.age = age;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public String getName() {return name;}}

Student类

public class Student extends Person{private String major;public Student(String name, int age, String major){super(name, age);//调用父类的带参构造方法this.major=major;}//重写父类的introduce方法@Overridepublic void introduce(){System.out.println("姓名:"+getName()+",年龄:"+getAge()+",主修:"+major);}
}

关于子类重写父类的示例方法,有以下规则:

  1. 方法名称:子类的重写方法与继承自父类的方法必须同名
  2. 返回类型:如果父类方法的返回类型基本类型或void,则子类方法的返回类型与父类方法的返回类型相同;如果父类方法的返回类型是类,则子类方法的返回类型与父类方法的返回类型相同或者是父类方法返回类型的子类
  3. 形式参数:子类方法的形参个数、类型必须与父类方法完全相同,只有参数的名称可以不相同
  4. 访问权限:子类方法的访问权限必须大于或等于父类方法的访问权限
  5. 抛出异常:子类方法不能声明抛出新的异常

4.super关键字与this关键字的区别

关键字super在子类的使用中,不仅可以调用父类的构造方法,还可以让子类访问继承自父类的实例成员:

  • super.方法名(参数)
  • super.成员变量

在子类重写了父类的实例方法的情况下,this关键字调用的是子类重写的方法,super关键字调用的是继承自父类的方法,我们可以举个例子对比一下二者的区别:
我们在刚刚写的Person类和Student类基础上,在Student类重写了父类的introduce方法以后,再在Student类里加上comIntroduce方法比较一下super和this的区别

运行结果表示:super调用的是继承自父类的方法,而this调用的是子类中重写的方法。

5.对象类型转换

具有继承关系的类之间是可以进行类型转换的(分为自动转换或强制类型转换),下面以这张图的继承关系为例子,介绍对象类型转换的规则:

规则1:子类类型引用可以自动转换为父类类型引用,这种转换称为向上类型转换

规则2:父类类型引用可以强制转换为子类类型引用,这种转换称为向下强制类型转换

规则3:没有继承关系的两个类的引用不能进行类型转换

关于对象的类型,Java语言有instanceof运算符可以检测对象的类型:
语法:对象 instanceof 类
结果:boolean,如果对象的实际类是后面的类或者是其子类,则返回true,否则返回false

如果我们要精确地判断一个对象是什么类,可以用到对象里的getClass()方法
语法:对象.getClass() == 类名.class
结果:boolean

Java面向对象的特性相关推荐

  1. Java 面向对象四大特性

    Java 面向对象四大特性 1.抽象  2.封装  3.继承   4.多态 1.抽象.抽象就是将一些事物的共性和相似点抽离出来,并将这些属性归为一个类,简单理解是:将需要解决的事情抽象成Java代码. ...

  2. 【职坐标】java面向对象三大特性(二)——继承详解

    [职坐标]java面向对象三大特性(二)--继承详解 a) 什么是继承? i. 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可 b) ...

  3. java 面向对象三大特性之继承 万字详解(超详细)

    目录 前言 : 一.为什么需要继承: 二.什么是继承(Warning : 篇幅较长)? 1.继承概述: 2.子类继承父类之后达到的效果 : ①如何使用继承? ②代码演示 : 3.继承的使用场景: eg ...

  4. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. java 面向对象三大特性之多态 万字详解(超详细)

    目录 前言 : 一.为什么需要多态 : 1.白璧微瑕 : 2.举栗(请甘雨,刻晴,钟离吃饭): 3.代码 : 4.问题 : 二.什么是多态 : 1.定义 : 2.多态的实现步骤(重要) : 三.多态的 ...

  6. java 面向对象的特性 抽象_java面向对象的四个特性

    java面向对象编程是指:Java语言提供类.接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements).另外 ...

  7. java 面向对象多态_乐字节Java面向对象三大特性以及Java多态

    ​ 以上就是本次学习的6大任务.我们依次来看. 1 Object类 Object类是所有Java类的根基类. 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类. cla ...

  8. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  9. java面向对象三大特性难吗_JAVA面向对象的三大特性

    JAVA面向对象的三大特性 每一对象是其状态和行为的封装.类是按一定体系和层次安排的,使得子类可以从超类继承行为.在这个类层次体系中有一个根类,它是具有一般行为的类.Java程序是用类来组织的.下面是 ...

  10. Java面向对象三大特性详解

    一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. 隐藏类的实例细节,方便修改和实 ...

最新文章

  1. AD rodc扩展报错
  2. C语言 文件操作10--配置文件读写
  3. 怎么设置表格根据窗口自动调整_Word排版技巧之表格美化,你值得拥有!
  4. IIS 7.0的ASP.NET应用程序生命周期概述
  5. linux异机拷贝,rman恢复异机数据库
  6. excel根据一列内容查找排序另一列_利用泰坦尼克生存数据讲述Excel数据分析的基本操作...
  7. Android 工程引入自定义Library后,工程无法识别Library中的类
  8. vc 控制台添加托盘显示_开源:ESP8266读DHT11温湿度,小程序实时显示
  9. LeetCode 1641. 统计字典序元音字符串的数目(DP)
  10. Linux系统用户账号的管理
  11. SPSS中的比较均值—均值分析过程
  12. 张飞实战电子硬件工程师90天学习资料及笔记汇总
  13. git checkout切换分支报错解决办法
  14. 判断一颗二叉树是否对称
  15. java sequencer_UVM学习笔记--sequence和sequencer(转)
  16. 这图怎么画 | 相关分析棒棒糖图
  17. MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引
  18. 抖音音乐号变现能力强不强,超详细运营攻略教程丨国仁网络
  19. 中外合作办学计算机科学与技术有哪些大学,校友会2017中外合作办学大学计算机科学与技术专业排行榜...
  20. oracle:时间间隔

热门文章

  1. 7/15 note3 转载集合
  2. 实时获取股票数据的android app应用程序源码分享
  3. Ansible自动化运维_超详细
  4. DS18B20 for STM32
  5. 别慌,大学是你乘风破浪的最佳时机————一个准大三的信息与计算科学专业学长想说的一些话
  6. spdlog 日志库学习,自定义 sink
  7. 专家解读:智能手机最终将被平板电脑取代的4大理由
  8. c语言改变WIncc画面窗口画面,wincc菜单栏画面窗口切换的脚本应用
  9. 长青公益五一开展助学活动
  10. 兰州水污染源:发现27年为何仍未根治