目录

--- 抽象类

--- 封装

抽象类:


在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。


定义:在Java语言中使用 abstract class 来定义抽象类。如下实例:

Employee.java - 抽象类

错误使用:直接使用抽象类,会出错,如下:

  1. /* 文件名 : AbstractDemo.java */
  2. public class AbstractDemo {
  3. public static void main(String [] args) {
  4. /* 以下是不允许的,会引发错误 */
  5. Employee e = new Employee("George W.", "Houston, TX", );
  6.  
  7. System.out.println("\n Call mailCheck using Employee reference--");
  8. e.mailCheck();
  9. }
  10. }

当你尝试编译AbstractDemo类时,会产生如下错误(因为上述的 Employee.java 是抽象类):

  1. Employee.java:: Employee is abstract; cannot be instantiated
  2. Employee e = new Employee("George W.", "Houston, TX", );
  3. ^
  4. error

正确使用:可以通过一般的方法继承 Employee 类:

  1. /* 文件名 : Salary.java */
  2. public class Salary extends Employee
  3. {
  4. private double salary; //Annual salary
  5. public Salary(String name, String address, int number, double
  6. salary)
  7. {
  8. super(name, address, number);
  9. setSalary(salary);
  10. }
  11. public void mailCheck()
  12. {
  13. System.out.println("Within mailCheck of Salary class ");
  14. System.out.println("Mailing check to " + getName()
  15. + " with salary " + salary);
  16. }
  17. public double getSalary()
  18. {
  19. return salary;
  20. }
  21. public void setSalary(double newSalary)
  22. {
  23. if(newSalary >= 0.0)
  24. {
  25. salary = newSalary;
  26. }
  27. }
  28. public double computePay()
  29. {
  30. System.out.println("Computing salary pay for " + getName());
  31. return salary/;
  32. }
  33. }

继承抽象类 - Salary.java

从而,我们不能实例化一个 Employee 类(抽象类)的对象,但是如果我们实例化一个 Salary 类(继承抽象类的一般类)对象,该对象将从 Employee 类继承3个成员变量和7个成员方法。如下:实例化使用继承类 Salary:

  1. /* 文件名 : AbstractDemo.java */
  2. public class AbstractDemo
  3. {
  4. public static void main(String [] args)
  5. {
  6. Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", , 3600.00);
  7. Employee e = new Salary("John Adams", "Boston, MA", , 2400.00);
  8.  
  9. System.out.println("Call mailCheck using Salary reference --");
  10. s.mailCheck();
  11.  
  12. System.out.println("\n Call mailCheck using Employee reference--");
  13. e.mailCheck();
  14. }
  15. }

使用继承类 - AbstractDemo.java


抽象类总结规定

  • 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。

  • 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  • 3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。

  • 4. 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。

  • 5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。


抽象方法:

如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。

Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。示例:

  1. public abstract class Employee{
  2. private String name;
  3. private String address;
  4. private int number;
  5.  
  6. public abstract double computePay(); // 声明 抽象方法
  7.  
  8. //其余代码
  9. }

声明抽象方法会造成以下两个结果:

  • 如果一个类包含抽象方法,那么该类必须是抽象类。
  • 继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。eg:如果Salary类继承了Employee类,那么它必须实现computePay()方法:
    1. /* 文件名 : Salary.java */
    2. public class Salary extends Employee
    3. {
    4. private double salary; // Annual salary
    5.  
    6. public double computePay()
    7. {
    8. System.out.println("Computing salary pay for " + getName());
    9. return salary/;
    10. }
    11.  
    12. //其余代码
    13. }

Java 封装:

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

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

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

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

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

封装的优点:

  • 1. 良好的封装能够减少耦合。

  • 2. 类内部的结构可以自由修改。

  • 3. 可以对成员变量进行更精确的控制。

  • 4. 隐藏信息,实现细节。


实现封装的步骤:

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

  1. public class Person {
  2. private String name;
  3. private int age; //将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏
  4. }

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

  1. public class Person{
  2. private String name;
  3. private int age;

  4. public int getAge(){
  5. return age;
  6. }

  7. public String getName(){
  8. return name;
  9. }

  10. public void setAge(int age){
  11. this.age = age; //采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
  12. }

  13. public void setName(String name){
  14. this.name = name;
  15. }
  16. }

java封装类的实例:

  1. /* 文件名: EncapTest.java */
  2. public class EncapTest{
  3.  
  4. private String name;
  5. private String idNum;
  6. private int age;
  7.  
  8. public int getAge(){
  9. return age;
  10. }
  11.  
  12. public String getName(){
  13. return name;
  14. }
  15.  
  16. public String getIdNum(){
  17. return idNum;
  18. }
  19.  
  20. public void setAge( int newAge){
  21. age = newAge;
  22. }
  23.  
  24. public void setName(String newName){
  25. name = newName;
  26. }
  27.  
  28. public void setIdNum( String newId){
  29. idNum = newId;
  30. }
  31. }
  32.  
  33. /*以上实例中 public方法 是外部类访问该类成员变量的入口。
  34. 通常情况下,这些方法被称为 getter 和 setter 方法。
  35. 因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。 */

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

  1. /* 访问 封装类 中的 私有变量
    * 文件名 : RunEncap.java */
  2. public class RunEncap{
  3. public static void main(String args[]){
  4. EncapTest encap = new EncapTest();
  5. encap.setName("James");
  6. encap.setAge();
  7. encap.setIdNum("12343ms");
  8.  
  9. System.out.print("Name : " + encap.getName()+
  10. " Age : "+ encap.getAge());
  11. }
  12. }

上一篇:Java 学习(12):重写(Override)与重载(Overload) & 多态

下一篇:Java 学习(14):接口 & 包(设置 CLASSPATH 系统变量)

Java 学习(13):抽象类& 抽象方法& 封装的更多相关文章

  1. Java学习笔记-抽象类与接口

    抽象类用于在类中不用具体实现,而在子类中去实现的类 抽象类 抽象类概述 抽象定义:抽象就是从多个事物中将共性的,本质的内容抽取出来 抽象类:Java中可以定义没有方法体的方法,该方法的具体实现由子类完 ...

  2. Java abstract关键字 抽象类 抽象方法

    用 abstract 修饰的类是抽象类,它不能生成对象 含有抽象方法的类称为抽象类 抽象方法使用 abstract 修饰 抽象类不能直接实例化,只能由子类实例化 举例 abstract class T ...

  3. Java面向对象13——抽象类

    抽象类  package oop.demon01.demon08; ​ //abstract 抽象类: 类 extends: 类---单继承   (接口可以多继承) public abstract c ...

  4. Java学习之抽象类的总结

    抽象类的特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中,该类必须也被abstract修饰.2,抽象类不可以被实例化.为什么?因为调用抽象方 ...

  5. java学习之jdbc的封装

    jdbc是连接数据库必不可少的工具,但每次连接都要重新写一遍太麻烦了,也不利于代码的可读性,这里做一个工具类进行封装. package com.gh; import java.sql.Connecti ...

  6. java学习笔记 --- 抽象类

    一.抽象类 (1)定义: 把多个共性的东西提取到一个类中,这是继承的做法. 但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体. 也就是说,方法声明一样,但是每个具体的对象在具体实现的时候 ...

  7. Java学习笔记 抽象类 接口 多态

    instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...

  8. [Java学习]面向对象-抽象类;接口

    抽象类 语法 public abstract class A{ } 定义 抽象类无法实例化.但抽象类有构造方法,在子类创建对象时用. 抽象类中可以定义抽象方法public abstract void ...

  9. Java学习之抽象类

    抽象类特点: 1.抽象方法必须定义在抽象类中2.abstract关键字修饰:只能修饰类和方法3.抽象类不能实例化4.抽象类中的方法要被使用,必须由子类重写所有的抽象方法,实例化其子类 如果子类只重写部 ...

随机推荐

  1. Android Camera+SurfaceView实现自己定义拍照

    对Activity强制横屏,保证预览方向正确. 使用OrientationEventListener监听设备方向.推断竖拍时,旋转照片后再保存.保证竖拍时预览图片和保存后的图片方向一致. 执行效果: ...

  2. 实习第四天(bboss框架学习)

    现在好像比较使用的管理工具是gradle管理工具,学长说这个管理工具比maven管理工具要好用! 我今天主要就是想要安装好的gradle这个管理工具,但是可能是我的eclispe版本的问题,我没能安装 ...

  3. Struts2国际化-getText()方法

    转自https://blog.csdn.net/qq_43560838/article/details/83747604 一:简单理解 国际化简称i18n,其来源是英文单词 international ...

  4. [学习笔记]BS架构与CS架构

    整理自:http://www.iteye.com/problems/102411 前两天面试的时候被问到这个问题,没有回答上来因此在这里学习整理一下. B/S架构 B/S架构的全称为Browser/S ...

  5. Codeforces 708D 费用流 (呃我们的考试题)

    NB的题目背景 输入输出一样 考试的时候貌似只有gzz一个人搞出来了 %gzz 思路: 分情况讨论 add(x,y,C,E) C是费用 E是流量 1. f>c add(x,y,2,inf),ad ...

  6. java9新特性-6-多版本兼容jar包

    1.官方Feature 238: Multi-Release JAR Files 2.使用说明 当一个新版本的Java出现的时候,你的库用户要花费数年时间才会切换到这个新的版本.这就意味着库得去向后兼 ...

  7. [转]60fps on the mobile web

    Flipboard launched during the dawn of the smartphone and tablet as a mobile-first experience, allowi ...

  8. Android 得到根Fragment

    public Fragment getRootFragment() { PlayFragment xFragment = null; for (Fragment fragment : getFragm ...

  9. benchmark测试PostgreSQL数据库OLTP性能

    1,安装配置PostgreSQL数据库 2,下载地址:http://sourceforge.net/projects/benchmarksql/?source=navbar Required:JDK7 ...

  10. UI Framework-1: Aura and Shell dependencies

    Aura and Shell dependencies The diagram below shows the dependencies of Chrome, Ash (Aura shell), vi ...