封装概述

简述

封装是面向对象的三大特征之一。

封装优点

提高代码的安全性。

提高代码的复用性。

“高内聚”:封装细节,便于修改内部代码,提高可维护性。

“低耦合”:简化外部调用,便于调用者使用,便于扩展和写作。

封装的实现--使用访问控制符

  1. private 表示私有,只能自己类能访问
  2. default 表示没有修饰符修饰,只有同一个包的类能访问。
  3. protected 表示可以被同一个包的类以及其他包中的子类访问。
  4. public 表示谁都可以调用。

关于 protected 的两个细节

  1. 若父类和子类在同一个包中,子类可访问父类的 protected 成员,也可以访问父类对象的 protected 成员。
  2. 若子类和父类不在同一个包中,子类可访问父类的 protected 成员,不能访问父类对象的 protected 成员。

访问控制符示意图:

封装详解

开发中封装的简单规则:

  1. 属性一般使用 private 访问权限。
  2. 属性私有后,提供相应的 get/set 方法来访问相关属性,这些方法通常是 public 修饰,以提供对属性的赋值与读取操作(注意点:boolean 变量的 get 方法是 is 开头)
  3. boolean 变量的 get 方法是 is 开头的
  4. 一些只用于本类的辅助性方法可以用 private 修饰,希望其他类调用的方法就用 public 修饰。

代码示例:JavaBean 的封装演示

package cn.jungle.test.encapsulation.a;

public class Person {
// 属性一般使用 private 修饰
private String name;
private int age;
private boolean flag;
// 为属性提供 public 修饰的 set/get 方法
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
// boolean 类型的属性 get 方法是 is 开头的
public boolean isFlag(){
return flag;
}
public void setFlag(boolean flag){
this.flag = flag;
}
}

代码示例:封装的使用

两个文件:Person.java 和 Test2.java

在 Person.java 中封装,然后 Test2.java 通过方法名去调用 Person.java 中的属性去赋值

(1) Person.java

package cn.jungle.test.encapsulation.a;

public class Person {
// 属性一般使用 private 修饰
private String name;
private int age;
private boolean flag;
// 定义空构造方法
public Person(){ }
public Person(String name,int age){
this.name = name;
// this.age = age; 这样子是不行的。构造方法中不能直接赋值,应该调用 setAge 方法
setAge(age);
} public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
// 在赋值之前先判断年龄是否合法
if (age > 130 || age < 0 ){
this.age = 18; // 不合法赋一个默认值 18
}else{
this.age = age; // 合法的话就赋值给属性 age
}
}
public int getAge(){
return age;
}
// toString() 方法的重写
@Override
public String toString(){
return "Person [name=" + name + ",age=" + age + "]";
}
}

Test2.java

package cn.jungle.test.encapsulation.a;

public class Test2{
public static void main(String[] args){
Person p1 = new Person();
// 下方会编译错误,对于封装以后的属性,不能直接用对象来调用属性进行赋值
// p1.name = "阿jun"; // 会编译出错
// p1.age = "200"; // 会编译出错
// 调用封装方法对属性进行赋值
p1.setName("阿jun");
p1.setAge(200);
// 没有输出打印对象的内存地址,咨询一位java朋友,他说是打印出来的是序列化好的字符串,即将对象转化成了字符串,即是下方的打印结果
System.out.println(p1); Person p2 = new Person("阿jun修炼手册",230);
// 没有输出打印对象的内存地址,咨询一位java朋友,他说是打印出来的是序列化好的字符串,是将对象转化成了字符串,即是下方的打印结果
System.out.println(p2);
}
}

多态

简述

多态指的是同一个方法调用,由于对象不同而产生的不同行为。

多种形态:同一个方法,具体实现会完全不同。

比如:同样是吃饭,东方人喜欢用筷子,西方人容易用叉子

多态的要点

多态的存在有三个必要条件:继承、方法重写、父类引用指向子类对象。

多态是方法的多态,不是属性的多态(多态与属性无关)。

父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

多态产生的原因

同一个方法调用时,传入不同对象,可能会调用不同的对象方法。

这些对象对应的子类重写了父类的方法。如果子类没有重写父类的方法,就没有多态。

代码示例:多态和类型转换

同一个包的两个文件:Animal.java(放置父类和子类) 和 Test.java(调用测试)

(1)Animal.java

package cn.jungle.polymophism;

// 定义一个父类--动物类
public class Animal {
public void shout(){
System.out.println("只叫了一声!");
}
}
// 定义一个 Dog 子类
class Dog extends Animal{
// 重写父类方法:shout()
@Override
public void shout(){
System.out.println("汪汪汪!");
}
}
// 定义一个 Bird 子类
class Bird extends Animal{
// 重写父类方法:shout()
@Override
public void shout(){
System.out.println("一只黄鹂鸣翠柳!");
}
}
// 定义一个 Man 子类
class Man extends Animal{
// 重写父类方法:shout()
@Override
public void shout(){
System.out.println("嘤嘤嘤嘤嘤嘤嘤!");
}
}
class Cat extends Animal{
@Override
public void shout() {
super.shout();
}
}

(2)Test.java

package cn.jungle.polymophism;

public class Test {
// 定义一个形参为父类对象的静态方法来测试多态的对象调用
static void animalCry(Animal a){
a.shout();
}
public static void main(String[] args) {
// 定义一个 Dog 类的对象
Dog d = new Dog();
animalCry(d); // 输出结果:汪汪汪!
// 父类引用指向子类对象
// 定义一个 Man 类的对象并且将其传入 animalCry() 方法进行调用
animalCry(new Man()); // 输出结果:嘤嘤嘤嘤嘤嘤嘤!
}
}

对象转型

简述

对象的转型分为两种:向上转型 和 向下转型

父类引用指向子类对象,这个过程称之为向上转型,属于是自动类型转换。

向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。

此时,则需要进行类型的强制转换,称之为向下转型。

闲谈

类型可以随便转,随意可把猫变狗或狗变猫,但是仅仅只能编译通过。

编译通过只是语法没问题,不代表程序可以运行起来。

真正运行时,是什么类型就还是执行什么类型的方法。

代码示例:对象的转型

以 Object 类和其子类 String 进行对象转型的代码举例

package cn.jungle.polymophism;

//以 Object 类和其子类 String 进行对象转型的代码举例
public class TestCasting {
public static void main(String[] args) {
Object obj = new String("阿jun修炼手册"); // 类对象向上(子类向父类)可以自动转型,无需强转
/**
* obj.charAt(0) 无法调用。编辑器认为 obj 是 Object 类型而不是 String 类型
* 编写程序时,如果想要调用运行时类型的方法,只能进行强制类型转换,否则无法通过编译器的检查
*/
String str = (String) obj; // 向下强制转型
System.out.println(str.charAt(0)); // 获取字符串中索引位置为 0 的字符
System.out.println(obj == str); // true; 因为这俩运行的是同一个对象
}
}

代码示例:向下类型转换异常

在向下转型过程中,必须将引用变量转成真实的子类类型(运行时的类型),否则会出现类型转换异常 ClassCastException 。

package cn.jungle.polymophism;

public class TestCasting2 {
public static void main(String[] args) {
Object obj = new String("阿jun修炼手册!");
// 真实的子类类型是 String,但是此处向下转型是 StringBuffer,编译不会报错,运行时会报错
StringBuffer str = (StringBuffer) obj;
// 编译不会报错,运行时会报错
System.out.println(str.charAt(0));
}
}

代码示例:向下转型中使用 instanceof 运算符

使用 instanceof 运算符可以有效避免向下类型转换异常的报错

package cn.jungle.polymophism;

// 向下转型中使用 instanceof 运算符
public class TestCasting3 {
public static void main(String[] args) {
// 定义多态对象
Object obj = new String("阿jun修炼手册!");
// 判断 obj 对象是不是右边类或者其子类创建的对象
if (obj instanceof String){ // 运算符结果为 true(没有强制转换之前)
// 测试输出
System.out.println("2");
// obj 向下强制类型转换
String str = (String)obj;
System.out.println(str.charAt(0));
}else if (obj instanceof StringBuffer){ // 结果为 false
System.out.println("1");
StringBuffer str = (StringBuffer)obj;
System.out.println(str.charAt(0));
}
}
}

18.Java 封装详解/多态详解/类对象转型详解的更多相关文章

  1. Java 面向对象概述原理: 多态、Object类,转型(8)

    Java 面向对象概述原理: 多态.Object类,转型(8) http://docs.oracle.com/javase/tutorial/java/IandI/override.html Java ...

  2. Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态

    Polymorphism[多态] 简述: 面向对象多态性指的是:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用 多态的三个前提条件: 多 ...

  3. Java 学习 时间格式化(SimpleDateFormat)与历法类(Calendar)用法详解

    基于Android一些时间创建的基本概念 获取当前时间 方式一: Date date = new Date(); Log.e(TAG, "当前时间="+date); 结果: E/T ...

  4. java封装继承以及多态(含代码)

    封装 该露的露,该藏的藏 我们常需设计要追求,"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成.不允许外部干涉:低耦合:仅暴漏少量的方法给外部使用. 封装(数据的隐藏) ...

  5. [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)

    1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...

  6. [Java Web学习]Spring MVC使用普通类对象,声明的对象为null

    由于对Spring还不熟悉,目前还处于学习阶段,因此经常会遇到一些小白问题,这个问题需要在Spring文件中将普通对象注入bean,然后在MVC中添加set方法,填充普通对象.

  7. Java RTTI(类型信息)(.class 类对象)

    RTTI:Run-Time Type Information,关键词在 Run-Time,运行时的,而非编译期确定的关于类型的信息.运行时的类型信息(RunTime Type Information) ...

  8. Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...

  9. java封装基础详解

    java封装基础详解 java的封装性即是信息隐藏,把对象的属性和行为结合成一个相同的独立单体,并尽可能地隐藏对象的内部细节. 封装的特性是对属性来讲的. 封装的目标就是要实现软件部件的"高 ...

随机推荐

  1. python接口自动化--json解析神器jsonpath

    前言 做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言. 当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间.一直在寻 ...

  2. (一):细说贝叶斯滤波:Bayes filters

    认知计算,还要从贝叶斯滤波的基本思想讲起,本文主要是对<Probabilistic Robotics>中贝叶斯滤波器部分的详细讲解. 这一部分,我们先回顾贝叶斯公式的数学基础,然后再来介绍 ...

  3. T-SQL——关于SQL打开Excel文件

    目录 0. 背景说明 1. 安装Access Database Engine 1. SQL脚本 3. .net项目中通过Micsoft.ACE.oledb读取Excel文件 志铭-2021年10月1日 ...

  4. scheduler源码分析——preempt抢占

    前言 之前探讨scheduler的调度流程时,提及过preempt抢占机制,它发生在预选调度失败的时候,当时由于篇幅限制就没有展开细说. 回顾一下抢占流程的主要逻辑在DefaultPreemption ...

  5. centos6.5 oracle 卸载

    1.使用SQL*PLUS停止数据库 [oracle@OracleTest oracle]$ sqlplus / as sysdba SQL> shutdown immediate; SQL> ...

  6. css超出隐藏显示省略号怎么设置?

    当我们在进行网页前端开发的时候,一般获取文章标题,然后一行一行的显示.但是当标题过长的时候,就会造成换行显示.还有显示部分文本信息时,如果全部显示就过于繁琐,会带来不会的网页体验感.虽然我们可以使用o ...

  7. VS2017离线安装QT插件出错:未能正确加载VSIX包

    问题现象: 问题已解决,忘记截图了 出现原因:可能是自己离线安装,安装版本与不符合当前VS吧.记得当时下载了一个最新的版本.重新卸载当前插件,再装一个合适版本即可 http://download.qt ...

  8. 洛谷3783 SDOI2017 天才黑客(最短路+虚树+边转点+线段树优化建图)

    成功又一次自闭了 怕不是猪国杀之后最自闭的一次 一看到最短路径. 我们就能推测这应该是个最短路题 现在考虑怎么建图 根据题目的意思,我们可以发现,在本题中,边与边之间存在一些转换关系,但是点与点之间并 ...

  9. appium+Andriod环境搭建遇到问题

    报错:Caused by: org.openqa.selenium.WebDriverException: An unknown server-side error occurred while pr ...

  10. 路由器的不同接口对WANsim的影响

    随着网络的快速发展,移动设备已经成为我们日常生活中不可或缺的一部分.人们习惯用手机看新闻.看视频.点外卖.打车.购物等等. 同时,广域网也为移动通讯带来了挑战.以视频流来举例,从用户终端到达服务器,这 ...