1. Java 封装

    1. 实现Java封装的步骤
  2. java面向对象值继承
    1. 概念:
    2. 继承的格式:
    3. 类和类之间的关系:
    4. 继承的特点:
    5. 继承的优缺点
      1. 继承的好处:
      2. 继承的缺点:
    6. 继承的注意事项:
    7. 使用继承的步骤:
  3. Java 多态
    1. 多态的优点
    2. 多态存在的三个必要条件
  4. 重写
    1. 方法重写的特点:
    2. 注意事项:

Java 封装

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过严格的接口控制。

封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

封装的优点

  • 良好的封装能够减少耦合。
  • 类内部的结构可以自由修改。
  • 可以对成员变量进行更精确的控制。
  • 隐藏信息,实现细节。

实现Java封装的步骤

修改属性的可见性来限制对属性的访问(一般限制为private),例如:

public class Person {
private String name;
private int age;
}

1.这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

2.对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

public class Person{
private String name;
private int age; public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

实例

让我们来看一个java封装类的例子:

public class EncapTest{

   private String name;
private String idNum;
private int age; public int getAge(){
return age;
}
public String getName(){
return name;
}
public String getIdNum(){
return idNum;
}
public void setAge( int newAge){
age = newAge;
} public void setName(String newName){
name = newName;
}
public void setIdNum( String newId){
idNum = newId;
}
}

以上实例中public方法是外部类访问该类成员变量的入口。

通常情况下,这些方法被称为getter和setter方法。

因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。

通过如下的例子说明EncapTest类的变量怎样被访问:

public class RunEncap{
public static void main(String args[]){
EncapTest encap = new EncapTest();
encap.setName("James");
encap.setAge(20);
encap.setIdNum("12343ms"); System.out.print("Name : " + encap.getName()+
" Age : "+ encap.getAge());
}
}
以上代码编译运行结果如下: Name : James Age : 20

java面向对象值继承

概念:

总结: 类是对一批对象的抽象,继承是对一批类的抽象。继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

继承的格式:

通过extends关键字可以实现类与类的继承

class 子类类名 extends 父类类名 {

}

被继承的这个类称为父类,基类或者超类

继承的这个类称为子类或者派生类

类和类之间的关系:

1.继承 (is a)

2.组合 (has a)

继承的特点:

1.通过extends关键字,实现了继承之后,让类与类之间产生了关系,建立关系是好还是坏? 有好友坏

2.继承的本质就是抽取共性代码,多个重复代码的向上抽取,简化代码

3.类是对一批对象的抽象,继承是对一批类的抽象

4.父类又被称为超类,或者基类,子类又被称为派生类

5.Java是面向对象语言,万事万物皆是对象,为了满足这个设计原则,所有的类都直接或者间接继承自Object类

继承的优缺点

继承的好处:

1.简化了代码

2.提高了扩展性

3.提高了可维护性

开闭原则: 对扩展开放,对修改关闭

继承的缺点:

开闭原则: 对扩展开放,对修改关闭

高内聚,低耦合: 类与类之间,功能与功能之间,模块与模块之间,功能尽量内聚,不同模块之间,尽量独立

1.造成了耦合性过高,牵一发动全身

注意: 继承一定要慎用,主要利用继承简化代码的优点

继承的注意事项:

1.单一继承性

2.支持多层继承

3.如果父类成员使用private修饰,那么子类不能被继承

4.如果一个子类继承了父类的属性和方法还可以有自己特有的属性和方法

5.当子类和父类的成员变量重名的时候,子类优先

6.构造方法不能够被继承

什么时候使用继承?

1.一般在写代码的时候发现代码中存在重复代码,需要向上抽取,考虑继承

2.当某个类的设计非常复杂的时候可以考虑继承 例如: 设计一个窗口类

使用继承的步骤:

1.先写子类

2.观察多个子类是否存在共性代码

3.如果存在,抽取共性代码到父类中

4.子类继承父类

5.将子类共性代码删除

注意: 父类命名: A is a B


import javax.swing.JFrame; public class ExtendsDemo {
public static void main(String[] args) {
PrimaryStudent ps = new PrimaryStudent();
ps.play(); MyFrame frame = new MyFrame();
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setTitle("HelloWorld");
frame.setVisible(true);
}
} class MyFrame extends JFrame { } class Student extends Person{
private String name;
int age = 5;
String gender;
double money;
Cat cat; public Student() {} public void payMoney(double money) {
this.money = money;
}
} class Person extends Object {} // 小学生类
class PrimaryStudent extends Student { private String address;
private int age = 10; public void play() {
int age = 20;
System.out.println("PrimaryStudent.play()");
System.out.println(age);
}
} // 中学生类
class MiddleStudent extends Student {
public void study() {
System.out.println("MiddleStudent.study()");
}
} // 大学生类
class BigStudent extends Student {
public void sleep() {
System.out.println("BigStudent.sleep()");
}
} class Cat {
private String name;
}

Java 多态

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

多态性是对象多种表现形式的体现。

现实中,比如我们按下 F1 键这个动作:

如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;

如果当前在 Word 下弹出的就是 Word 帮助;

在 Windows 下弹出的就是 Windows 帮助和支持。

同一个事件发生在不同的对象上会产生不同的结果。

多态的优点

  1. 消除类型之间的耦合关系
  2. 可替换性
  3. 可扩充性
  4. 接口性
  5. 灵活性
  6. 简化性

多态存在的三个必要条件

继承

重写

父类引用指向子类对象

比如:

Parent p = new Child();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

以下是一个多态实例的演示,详细说明请看注释:

public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法 Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
} public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
} abstract class Animal {
abstract void eat();
} class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
} class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
执行以上程序,输出结果为: 吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

重写

为什么需要方法重写?

当父类的方法不能够满足子类的需求的时候,需要方法重写

方法重写的特点:

1.发生在具有子父类的两个类中

2.方法名相同

3.参数列表完全相同

4.返回值类型可以相同或者是其子类

5.访问权限修饰符不能够严于父类

访问权限修饰符的宽严关系

public > protected > default > private

6.抛出的异常不能够被扩大

注意事项:

1.private修饰的方法不能够被继承,所以不能够被重写

2.构造方法不能够被重写

3.子类重写父类的方法时,访问权限修饰符不能更低,严格

4.返回值类型相同或者是其子类

5.重载和重写的区别

public class OverrideDemo01 {

}

class Father {
public void sing() {
System.out.println("唱红歌");
}
Father dance() /*throws NullPointerException*/ {
System.out.println("霹雳舞");
Father f = new Father();
return f;
}
}
class Son extends Father {
public void sing() {
System.out.println("唱国歌");
} @Override
protected Son dance() /*throws Exception*/ {
return new Son();
} }

多态的实现方式

方式一:重写:

  1. 这个内容已经在上一章节详细讲过,就不再阐述,详细可访问:Java 重写(Override)与重载(Overload)。

    方式二:接口
  2. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
  3. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。

    方式三:抽象类和抽象方法

java面向对象总结(二)的更多相关文章

  1. Java面向对象(二、继承)

    Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法 ...

  2. Java面向对象编程(二)

    上一篇博文里总结了面向对象三大特性在Java中的体现.如今谈一谈Java中的抽象类,接口,内部类等特性. 一. 抽象类 public abstract class Shape { public int ...

  3. Java 面向对象(二)封装

    一.封装(Encapsulation) 1.概述 封装是面向对象编程的核心思想.把对象的属性和行为封装起来,其载体就是类. 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的, ...

  4. java面向对象(二)之继承

    继承 介绍 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.继承即常说的is-a关系.子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承 ...

  5. java 面向对象(二十九):异常(二)异常的处理

    1.java异常处理的抓抛模型过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象. * 并将此对象抛出. * 一旦抛出对象以后,其后的代 ...

  6. java 面向对象(二十五):内部类:类的第五个成员

    内部类:类的第五个成员 1.定义: Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类.2.内部类的分类:成员内部类(静态.非静态 ) vs 局部内部类(方法内.代码块内.构 ...

  7. java面向对象基础(二)

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  8. Java面向对象(二)

    一.封装 1.为什么要使用封装在类的外部直接操作类的属性是”不安全的"2.如何实现封装   1).属性私有化:设置属性的修饰符为private    2) .提供公共的set和get方法赋值 ...

  9. java 面向对象(二十八):异常 一

    1. 异常的体系结构 * java.lang.Throwable * |-----java.lang.Error:一般不编写针对性的代码进行处理. * |-----java.lang.Exceptio ...

随机推荐

  1. prometheus + grafana + node_exporter + alertmanager 的安装部署与邮件报警 (一)

    大家一定要先看详细的理论教程,再开始搭建,这样报错后才容易找到突破口 参考文档 https://www.cnblogs.com/afterdawn/p/9020129.html https://www ...

  2. 2018-2019-1 20189210 《LInux内核原理与分析》第八周作业

    一 .可执行程序工作原理 程序编译 预处理:gcc -E hello.c -o hello.i 编译:gcc -S hello.i -o hello.s -m32 汇编:gcc -c hello.s ...

  3. [LeetCode] Design HashSet 设计HashSet

    Design a HashSet without using any built-in hash table libraries. To be specific, your design should ...

  4. mysql 查询 练习题及答案

    CREATE DATABASE school;USE school;/*1.创建student表格*//*id为主键 非空 唯一 */CREATE TABLE student (id INT(10) ...

  5. Python全栈-magedu-2018-笔记5

    第三章 - Python 内置数据结构 字符串 一个个字符组成的有序的序列,是字符的集合. python中一个字符也是str类型. 使用单引号.双引号.三引号引住的字符序列 字符串是不可变对象 Pyt ...

  6. 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求

    <script type="text/jscript"> $(function () { $("#btn_uploadimg").click(fun ...

  7. linux基础命令--groupdel 删除群组

    描述 groupdel命令用于删除用户组. groupdel命令会去修改系统下的/etc/group和/group/gshadow文件,删除有关用户组的所有项目(一般来说使用groupadd或user ...

  8. springboot热部署配置

    1.pom添加spring-boot-devtools依赖和配置编译插件 <dependency> <groupId>org.springframework.boot</ ...

  9. 《图解HTTP》读书笔记(六:HTTP状态码)

    状态码的职责是当客户端向服务器端发送请求时, 描述返回的请求结果. 借助状态码, 用户可以知道服务器端是正常处理了请求, 还是出现了错误. 状态码类别 HTTP状态码由三个十进制数字组成,第一个十进制 ...

  10. Redis 开发规范

    本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题. 一.键值设计 1.key名设计 ...