前言: 

  在刚开始接触Java的时候,那时候面对Java面向对象的几大特征一直理解的不是很理解,借着空闲时间在这里整理一下,同时在加深一下印象。

一、封装:

    Java面向对象的特征之封装,所谓的封装就是指一个类把自己内部的实现细节隐藏,对外提供set/get方法,封装又分为属性的封装和方法的封装。把属性定义为私有的,它们通过setter和getter方法来对属性的值进行设定和获取,在我们实际的代码开发正分装用到的地方非常广泛,举个最简单的例子就是我们的pojo 

public class User {

    private Integer userID;

    private String userName;

    private String address;

    public Integer getUserID() {
return userID;
} public void setUserID(Integer userID) {
this.userID = userID;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
}
}

    在上面类中,定义了三个成员变量,它们的访问修饰都是private私有的,通过setter和getter方法对这些变量进行设值以及取值。那么这么做有什么好处呢?封装的意义就是增强类的信息隐藏与模块化,提高安全性。封装的主要作用也是对外部隐藏具体的实现细节,增加程序的安全性。

二、继承:

  在Java中如果现有类无法满足我们所需的字段或方法时、同时我们又不想或无法更改现有类是,这时我们则需要重新创建一个新的类同时继承之间的类,新创建的类我们称为(子类),子类可以拥有父类的成员变量以及成员方法(非私有)继承的作用就是能提高代码的复用性。子类拥有父类中的一切,它可以访问和使用父类中的非私有成员变量,以及重写父类中的非私有成员方法。

  定义一个父类Person其中有如下方法和字段:    

public class Person {
private Integer age; public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public void test(){
System.out.println("父类test方法");
} public void mowen(){
System.out.println("父类莫问方法");
}
}

  定义一个子类User并且继承Person类:   

public class User extends Person{

    private Integer userID;

    private String userName;

    private String address;

    public void test(){
System.out.println("子类test方法");
} public Integer getUserID() {
return userID;
} public void setUserID(Integer userID) {
this.userID = userID;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
}
}

  执行测试:

public class Test {

    public static void main(String[] args){
User user = new User();
user.setAge(12);
user.test();
user.mowen();
System.out.println(user.getAge());
}
}

  测试结果:

子类test方法
父类莫问方法
12 Process finished with exit code 0

  我们很清楚的看到子类中可以调用父类中的莫问()方法,且在子类中重写了父类的test()方法,执行结果以子类为准,且子类继承了父类的字段age。

三、抽象:

  当一个类中有一个abstract修饰符(但要注意只要有抽象方法的类就是抽象类)、父类中存在抽象方法(也可以没有)抽象方法没有方法体并且修饰符一定要是public或者protected,且抽象类不能不能实例化

  所有子类都必须实现这些抽象方法(如果没实现就必须把它也定义成一个抽象方法) 虽然不能new出来但是它可以有自己的static方法。

  抽象类中可以定义抽象方法和不同方法,也可以定义变量,但如果抽象类存在抽象方法(注:抽象方法不能用private私有化),继承他的子类必须要实现该方法,否则编译就无法通过

四、多态:

  在面向对象的四个基本特征中多态是非常重要的,同时相比较其他的特征稍微复杂一点,下面就重点说一下Java中的多态

    多态存在的必要条件:

      1、有继承关系  

      2、子类重写父类方法  

      3、父类引用指向子类对象

    多态存在必须要有“子类重写父类方法”这一条件,name就要注意下面三种情况是没有办法表现出多态特性的(因为不能被重写):

      1、static方法,因为被static修饰的方法是属于类的,而不是属于实例的

      2、final方法,因为被final修饰的方法无法被子类重写

      3、private方法和protected方法,前者是因为被private修饰的方法对子类不可见,后者是因为尽管被protected修饰的方法可以被子类见到,也可以被子类重写,但是它是无法被外部所引用的,一个不能被外部引用的方法,怎么能谈多态呢

  先来编写两个类Father、Children,同时Children继承Father类

public class Father {

   private Integer age;

   public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}
public class Children extends Father{

    private String userName;

    public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
}
}

  向上转型:(子类进行类的提升转换为父类)

public class Test {

    public static void main(String[] args){
Father father = new Children();
father.setAge(22);
((Children) father).setUserName("逝清雪");
System.out.println(father.getAge() + "\n" + ((Children) father).getUserName());
}
}

  测试结果:

22
逝清雪 Process finished with exit code 0

    通过测试我们可以发现,当子类进行类的提升后,原本父类(Father)中并没有UserName字段,而UserName这个字段原本是出现在子类中的,但现在父类却可以对子类的中的字段进行操作,由此可以看出:多态中的向上转型后,父类拥有了子类的特性,换句话说,向上转型后还是子类自己本身。

  向下转型:(在java中Children c = new Father()是无法编译通过的,在这里必须强行转换)

public class Test {

    public static void main(String[] args){
Father father = new Children();
Children children = (Children) father;
children.setAge(22);
children.setUserName("逝清雪");
System.out.println(father.getAge() + "\n" + ((Children) father).getUserName());
}
}

  测试结果:    

22
逝清雪 Process finished with exit code 0

    向下转型,我们必须要进行强转,同时可以看到子类可以操作父类中的字段,由此可以看出:向下转型子类拥有了父类的特性,

  由此我们可以看出:在Java中的多态不管是向上转型、还是向下转向,最后都还是子类本身。

  

    

      

Java 面向对象的基本特征的更多相关文章

  1. Java面向对象的三大特征

    Java面向对象的三大特征 java面向对象的三大特征:“封装.继承.多态”.更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. ...

  2. Java面向对象的三大特征和五大原则

    Java面向对象的三大特征 封装 封装(Encapsulation)是指属性私有化,根据需要提供setter和getter方法来访问属性.即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问 ...

  3. JAVA面向对象:三大特征 封装讲解

    一.JAVA封装 1.封装的理解 封装是 JAVA 面向对象思想的 一 种特性,也是一种信息隐蔽的技术 2.封装的原则 将类中的某些信息隐藏起来,来防止外部程序直接访问,通过类中的方法实现对隐藏的信息 ...

  4. Java面向对象的三大特征详解

    一.封装(Encapsulation)       封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保 ...

  5. 封装是java面向对象编程三大特征之一。 简单的属性封装

    package com.cqvie.Hello; class Person { private int age; private String name; public void tell() {   ...

  6. Java面向对象的三个特征

    首先,Java面向对象的三大特征: 三大特征: ▪ 封装 ▪ 继承 ▪ 多态 首先面向对象的第一个特性 封装 : 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操 ...

  7. java面向对象特征 — 一句话概括

    java基础学习总结之基本特征,最开始学习的时候,是形而上的理解,用了3年多,再回头看,理解起来颇为顺理成章 语言学习大概就是这样一种规律,学习,不甚解,应用,应用,渐深入人心,回头一看,恍然一悟 最 ...

  8. Java面向对象编程:封装,继承,多态

    Java面向对象的三大特征: 封装:通过Java的类来实现数据和操作方法的封装,对外界可以将每一个Java类都视为一个黑箱,只需调用该黑箱提供的方法即可完成你想要的操作. 继承:通过类的继承,将统一的 ...

  9. 封装继承多态-java面向对象三大特征

    第七章  封装和继承 一.面向对象的三大特征 封装.继承.多态 二.封装 将类的属性(字段)设置为私有的(private),并添加getter/setter方法操作属性. 注意:get|set方法的固 ...

随机推荐

  1. springboot之JdbcTemplate

    springboot可以使用JdbcTemplate进行数据库访问,代码如下 添加pom文件 <parent> <groupId>org.springframework.boo ...

  2. python地理处理包——pySAL使用

    Pysal是基于Python的开源地理处理库,能提供高层次的空间分析功能.

  3. 通过Excel文件快速创建页面和数据表

    在设计一个软件系统,构建过程:需求->数据表->系统开发.实际情况是需求(数据)很多来源于已经存在的文件中,客户会要求把这些数据“电子化”,这就给需求分析产生了很大的工作量: 分析这些原始 ...

  4. Dynamics AX 2012 R2 电子邮件广播错误 0x80040213

    Dynamics AX 2012 R2 电子邮件广播错误 0x80040213 今天Reinhard在新环境做邮件广播测试时,发现无法发送邮件,并报以下错误: 类"CDO.Message&q ...

  5. iOS-----------计算两个时间的时间差

    UIButton * nameButton = [UIButton buttonWithType:UIButtonTypeCustom]; nameButton.frame = CGRectMake( ...

  6. EditText超出字数限制,给用户提示

    当我们在Editext输入内容的时候,检测如果超过限制的长度无法输入内容,并且给用户提示. 首先我想到了下面的方法: editText.addTextChangedListener(new TextW ...

  7. dotnet core 入门命令

    官方资料: https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-restore?tabs=netcore2x 常规 项目引用 NuGet ...

  8. 基本的CRUD操作

    导入包---实体类------数据库连接----数据库操作----service层数据操作----网页对service层可视化实现 model package com.ij34.model; publ ...

  9. Page Cache与Page回写

    综述 Page cache是通过将磁盘中的数据缓存到内存中,从而减少磁盘I/O操作,从而提高性能.此外,还要确保在page cache中的数据更改时能够被同步到磁盘上,后者被称为page回写(page ...

  10. 【iOS开发】Alamofire框架的使用一基本用法

    Alamofire框架的使用一 —— 基本用法 对于使用Objective-C的开发者,一定非常熟悉AFNetworking这个网络框架.在苹果推出的Swift之后,AFNetworking的作者专门 ...