封装

封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

代码理解

public class Student {

    public Student(String name, Integer age) {
this.name = name;
this.age = age;
} private String name;
private Integer age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

核心要点

  • 数据是私有的
  • 获取只能通过getter方法
  • 更改只能通过setter方法

注意要点

  • getter方法禁止返回可变对象的引用,可变对象引用会破坏封装(下面演示错误的使用封装方法)

    public class Student {
    
        public Student(Date birthday) {
    this.birthday = birthday;
    } private Date birthday; public Date getBirthday() {
    return birthday;
    } public void setBirthday(Date birthday) {
    this.birthday = birthday;
    }
    } class Main{
    public static void main(String[] args) {
    Student student = new Student(new Date());
    System.out.println("student对象的Date:"+student.getBirthday());//student对象的Date:Tue Dec 11 10:50:50 CST 2018
    Date birthday = student.getBirthday();
    birthday.setTime(888888888);
    System.out.println("student对象的Date:"+student.getBirthday());//student对象的Date:Sun Jan 11 14:54:48 CST 1970
    }
    }

继承

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

代码理解

public class Student extends People {

}

class People{
void sayHello(){
System.out.println("Hello Word");
} } class Main{
public static void main(String[] args) {
Student student = new Student();
student.sayHello();
}
}

核心要点

  • 子类会继承父类的非private的属性和方法
  • 可以在子类构造器中使用super关键字对父类private私有与域进行初始化
  • 在类的继承层次中可以使用abstract定义抽象类作为派生其他类的基类
    • 包含一个或者多个的抽象方法必须声明为抽象类
    • 抽象类不可以被实例化
    • 子类实现所有的抽象方法后不再是抽象类
    • 抽象类的层次中可以使用多态既抽象类对象变量引用非抽象类子类实例

多态

一个对象变量可以指向多种实际类型的现象被成为多态;在运行时能够自动选择调用那个方法被称为动态绑定.

代码理解

public class Student extends People {
@Override
void sayHello(){
System.out.println("I am a Student");
}
void studentHello(){
System.out.println("It is student Say");
}
}
class Teacher extends People{
}
class People{
void sayHello(){
System.out.println("Hello Word");
}
}
class Main{
public static void main(String[] args) {
People people1 = new Teacher();
People people2 = new Student();
people1.sayHello();
people2.sayHello();
((Student) people2).studentHello();
}
}

核心要点

  • 要实现多态必须存在继承关系(student和teacher都继承people)

  • 子类需要将父类的方法重写(继承已经默认重写),如果重写了父类方法则会使用重写方法

  • 需要将子类的引用赋值给父类,这样父类变量就可以调用非子类特有方法

  • 父类引用不可以赋值给子类变量,如果必须需要;可以使用强制类型转换,强制类型转换会暂时忽略对象的实际类型,使用对象的全部功能

    Student student = (Student) new People();

Java基础之理解封装,继承,多态三大特性的更多相关文章

  1. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  2. Java入门教程九(封装继承多态)

    封装 封装就是将对象的属性和方法相结合,通过方法将对象的属性和实现细节保护起来,实现对象的属性隐藏.做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(s ...

  3. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  4. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  5. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  6. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  7. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  8. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  9. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

随机推荐

  1. Springboot @webfilter @order filter过滤器

    我们使用@WebFilter注解的时候发现注解里面没有提供可以控制执行顺序的参数 @WebFilter 的属性 属性名 类型 描述 filterName String 指定过滤器的 name 属性,等 ...

  2. struts2防止反复提交的办法

    <? xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC " ...

  3. Jackson Gson Json.simple 比较

    为公司做了小任务,需要用到Java Json库,Json库我几个月之前就用过,不过那时候是跟着项目来的,延续了项目的使用习惯直接用了jackson Json,而这次我觉得好好比较一下几个常见的Json ...

  4. CentOS 6.4 SSH 免密码登录

    在配置apache集群分布时,要使用SSH免密码登录.假设现在有两台机器apache@svn(192.168.1.100)作为svn机,apache@app(192.168.1.101)作为app机. ...

  5. 简单思考 如何用PHP输出本周的周三日期

    简单思考 如何用PHP输出本周的周三日期?比如今天2017-10-31 计算本周周三应该是2017-11-01 自己动脑筋想一想,然后给我留言或者评论

  6. 【Postgres】PostgreSQL配置远程连接

    1.开启相应的防火墙端口,缺省是5432 2.访问权限配置,D:\Program Files (x86)\PostgreSQL\9.2\data/pg_hba.conf中加入如下配置,开启远程访问 3 ...

  7. 我的WAF Bypass实战系列

    ​ 梳理了一下自己写过的WAF Bypass相关的文章,按照编写时间顺序,整理成了一个WAF Bypass实战系列,如果你准备了解WAF攻防这一块的内容,可以来了解一下. 第一篇:<Bypass ...

  8. jinja2主要语法

    jinja2主要语法 1.变量 {{name}} 2.控制语句 {% if %} {{name}} {% else %} {{name2}} {% endif%} 3.宏 {% macro check ...

  9. react native (一)

    开始接触app方面的工作,真心塞~ 又开始了周而复始的死磕一个问题专坐一整天的节奏,关键是还没有成绩,实在无语.╮(╯▽╰)╭,还是总结一下最近心塞历程吧-- react native中文网:http ...

  10. 扩展方法以及LinQ的学习

    我们今天学习的内容其实还是蛮多的,学习了自动属性,扩展方法,复习初始化器,以及LinQ的一些方法,其实感觉有些还是很熟悉的,在前面的学习过程中有时间感觉学习的知识知道了怎么使用,但是还没有在项目中使用 ...