Java自学之类结构扩展

面向对象中的核心组成是类与接口,在项目中会利用【包】进行一组相关类的管理,这样适合于程序代码的部分更新,也更加符合面向对象封装性的概念,同时合理地使用封装也可以方便地实现实例化对象数量的控制。

包的定义

在Java程序中,包主要的目的是可以将不同功能的文件进行分割。所谓的包实际上是指文件夹,在Java中可以使用package定义包名,此语句必须编写在源代码的首行。

package cn.uihtml.demo;
 class Hello {
     public static void main(String[] args) {
         System.out.println('www.uihtml.cn');
     }
 }

本程序将Hello类放在一个自定义的包中,这样一来在程序编译后就必须将*.class文件保存在指定的目录中。

手工建立程序包目录非常麻烦,此时最好的做法是进行打包编译处理。

javac -d . Hello.java

【-d】表示要生成目录,而目录的结构就是package定义的结构。

【.】表示在当前所在的目录中生成程序类文件。

包的导入

利用包的定义可以将不同功能的类保存在不同的包中以实现分模块开发的需求,但是不同包中的类彼此之间也一定存在相互调用的关系,那么这时就需要使用import语句来导入被调用的其他包中的程序类。

package cn.uihtml.util;
 class Message {
     public String getContent() {
         return 'www.uihtml.cn';
     }
 }
package cn.uihtml.demo;
 import cn.uihtml.util.Message;
 class JavaDemo {
     public static void main(String[] args) {
         Message msg = new Message();
         System.out.println(msg.getContent());
     }
 }

本程序实现了不同包中类的引用,在JavaDemo类中需要使用import语句导入指定的类,这样就可以直接实例化类对象并且进行相应方法调用。

自动导入

在进行不同包类导入时,除了使用【“import 包.类”】名称的形式外,还可以使用【“import 包.*”】的通配符形式自动进行导入处理,这样可以减少import语句的编写数量

package cn.uihtml.demo;
 import cn.uihtml.util.*;
 class JavaDemo {
     public static void main(String[] args) {
         Message msg = new Message();
         System.out.println(msg.getContent());
     }
 }

静态导入

当一个类中的全部组成方法都是static时,可以使用静态导入机制进行操作。

package cn.uihtml.util;
 class MyMath {
     public static int add(int… args) {
         int sum = 0;
         for (int item : args) {
             sum += item;
         }
         return sum;
     }
     public static int sub(int x,int y) {
         return x - y;
     }
 }
package cn.uihtml.demo;
 import static cn.uihtml.util.MyMath.*;
 class JavaDemo {
     public static void main(String[] args) {
         System.out.println(add(1,2,3,4,5));
         System.out.println(sub(10,6));
     }
 }

jar文件

jar【Java Archive,Java归档文件】是一种Java给出的压缩格式文件。

如果要使用jar文件的话,可以利用jar命令完成。在实际开发中,Java最常用的3个参数如下。

  • 【-c】:创建一个新的文件;
  • 【-v】:生成标准的压缩信息;
  • 【-f】:由用户自己指定一个*.jar的文件名称;

源代码需要首先编译为*.class文件后才可以打包为jar文件。

访问控制权限

范围privatedefaultprotectedpublic
同一包的同一类truetruetruetrue
同一包的不同类truetruetrue
不同包的子类truetrue
不同包的非子类true

对于访问控制权限,初学者把握以下的原则即可。

属性声明以private为主。

方法声明以public为主。

对于封装性实际上是有3种表示方式:private、default、protected

构造方法私有化

在类结构中每当使用new关键字都会调用构造方法并实例化新的对象,然而在设计中,也可以利用构造方法的私有化形式来实现实例化对象的控制。

单例设计模式

单例设计模式是指在整个系统中一个类只允许提供一个实例化对象,为实现此要求就可以通过private进行构造方法的封装,这样该类将无法在类的外部利用new关键字实例化新的对象,同时为了方便使用本类的方法,则可以在内部提供一个全局实例化对象供用户使用。

package cn.uihtml.demo;
 class Singleton {
     // 在类的内部进行Singleton类对象实例化,为了防止可能出现重复实例化所以使用final标记
     // 定义成员属性时直接进行实例化对象,俗称饿汉式单例设计模式
     private static final Singleton INSTANCE = new Singleton();
     // 构造方法私有化,外部无法通过new关键字实例化对象
     private Singleton() {}
     /**
     * 获取本类实例化对象方法,static方法属于类方法,可以不受实例化对象的限制进行调用
     * @return INSTANCE内部实例化对象,不管调用多少次此方法,都只会返回同一个实例化对象
     */
     public static Singleton getInstance() {
         return INSTANCE;
     }
     public void print() {
         System.out.println('www.uihtml.cn');
     }
 }
package cn.uihtml.demo;
 class JavaDemo {
     public static void main(String[] args) {
         Singleton instance = null;
         instance = Singleton.getInstance();
         instace.print();
     }
 }

对于单例设计模式也分为两种:饿汉式单例设计模式和懒汉式单例设计模式,两种单例设计模式的主要差别是在于对对象进行实例化的时机。饿汉式单例设计模式是在类中定义成员属性时直接进行实例化对象处理,懒汉式单例设计模式是在第一次使用类的时候才会进行对象实例化。

懒汉式单例设计模式

package cn.uihtml.demo;
 class Singleton {
     // 定义公共的instance属性,由于需要在第一次使用时实例化,所以无法通过final关键字定义
     private static Singleton instance;
     pirvate Singleton() {}
     /**
     * 获取本类实例化对象方法,static方法不受实例化对象的限制,可以直接调用
     * @return 返回唯一的一个Singleton类的实例化对象
     */
     public static Singleton getInstance() {
         if (instance == null) {
             instance = new Singleton();
         }
         retrun instance;
     }
     // 定义普通方法,需要进行实例化对象后。才能调用
     public void print() {
         System.out.println('www.uihtml.cn')
     }
 }

多例设计模式

单例设计模式只留有一个类的实例化对象,而多例设计模式会定义多个【有限】对象。

package cn.uihtml.demo;
 class Color {
     // 在类内部提供若干个实例化对象
     private static final Color RED = new Color('红色');
     private static final Color GREEN = new Color('绿色');
     private static final Color BLUE = new Color('蓝色');
     private String title;
     private Color(String title) {
         this.title = title;
     }
     public static Color getInstance(String Color) {
         switch(color) {
             case 'red':
                 return RED;
             case 'green':
                 return GREEN;
             case 'blue':
                 return BLUE;
             default:
                 return null;
         }
     }
     public String toString() {
         return this.title;
     }
 }
package cn.uihtml.demo;
 class JavaDemo {
     public static void main(String[] args) {
         Color c = Color.getInstance('green');
         System.out.println(c);
     }
 }

枚举

Java语言设计之初并没有枚举的概念,所以开发者不得不使用多例设计模式来代替枚举的解决方案。从JDK1.5开始,Java提供了一个新的关键字:enum,利用此关键字可以实现枚举类型的定义,利用枚举可以简化多例设计模式的定义

package cn.uihtml.demo;
 // 枚举类
 enum Color {
     // 实例化对象
     RED,GREEN,BLUE;
 }
package cn.uihtml.demo;
 class JavaDemo {
     public static void main(String[] args) {
         Color c = Color.RED;
         System.out.println(c)
     }
 }

本程序中,所有枚举类的对象名称全部采用了大写字母定义,这一点是符合多例设计模式要求的,同时枚举类对象的名称也可以采用中文的形式进行定义

枚举除了简化多例设计模式之外,也提供了方便的信息获取操作,利用“枚举类.values()”结构就可以以对象数组的形式获取枚举中的全部对象。

package cn.uihtml.demo;
 enum Color {
     GREEN,RED,BLUE;
 }
package cn.uihtml.demo;
 class JavaDemo {
     public static void main(String[] args) {
         for(Color c : Color.values) {
             System.out.println(c + '、');
         }
     }
 }

Enum类

枚举并不是一个新的类型,它只是提供了一种更为方便的结构,严格来讲,每一个使用enum定义的类实际上都属于一个类继承了Enum父类而已。

在枚举类中除了可以定义若干个实例化对象之外,也可以像普通类那样定义成员属性、构造方法、普通方法,但是需要记住的是,枚举的本质上是属于多例设计模式,所以构造方法不允许使用public进行定义,如果类中没有提供无参构造方法,则必须在定义一个枚举对象时明确传入参数内容。

package cn.uihtml.demo;
 enum Color {
     // 枚举对象要写在首行
     RED('红色'),GREEN('绿色'),BLUE('蓝色');
     // 成员属性
     private String title;
     // 构造方法初始化属性
     private Color(String title) {
         this.title = title;
     }
     @Override
     public String toString(){
         return this.title;
     }
 }
package cn.uihtml.demo;
 class JavaDemo {
     public static void main(String[] args) {
         for (Color c : Color.values()) {
             System.out.println(c + '、');
         }
     }
 }

通过枚举类实现接口

package cn.uihtml.demo;
 interface IMessage {
     public String getMessage();
 }
package cn.uihtml.demo;
 enum Color implements IMessage {
     RED('红色'),GREEN('绿色'),BLUE('蓝色');
     private String title;
     private Color(String title) {
         this.title = title;
     }
     @Override
     pblic String getMessage() {
         return this.title;
     }
 }
package cn.uihtml.demo;
 class JavaDemo {
     public static void main(String[] args) {
         IMessage msg = Color.RED;
         System.out.println(msg.getMessage())
     }
 }

本程序让枚举类实现了IMessage接口,这样就需要在枚举中覆写接口中的抽象方法,由于Color时IMEssage接口子类,所以每一个枚举对象都可以通过对象的向上转型实现IMessage接口对象实例化。

在枚举中定义抽象方法

枚举还有一个特别的功能就是可以直接进行抽象方法的定义,此时可以在每一个枚举对象中分别实现此抽象方法。

package cn.uihtml.demo;
 enum Color {
     RED('红色') {
         @Override
         public String getMessage() {
             return '颜色为:' + this;
         }
     }, GREEN('绿色') {
         @Override
         public String getMessage() {
             return '颜色为:' + this;
         }
     }, BLUE('蓝色') {
         @Override
         public String getMessage() {
             return '颜色为:' + this;
         }
     }
     // 定义抽象方法
     public abstract String getMessage();
 }
package cn.uihtml.demo;
 class JavaDemo {
     public static void main(String[] args) {
         System.out.println(Color.RED.getMessage());
     }
 }

枚举主要是定义了实例化对象的使用范围,同时枚举类型也可以作为成员属性类型。

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/java/java-class-structure.html

Like (0)
Donate 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
Previous 2020年12月8日
Next 2020年12月11日

相关推荐

  • JavaWeb入门案例之用户注册

    前言 之前把Java的基础知识系统的过了一遍,目前总算可以看懂Java代码了,接下来就是要学习Java开发框架(主要是springMVC)。 下面用一个用户注册的小案例,来总结一下…

    2021年1月13日
    1.4K
  • Java自学之反射机制

    重用性是面向对象设计的核心原则。为了进一步提升代码的重用性,Java提供了反射机制。反射技术首先考虑的是“反”与“正”的操作,所谓的“正”操作,是指当开发者使用一个类的时候,一定要…

    2020年12月24日
    1.1K
  • Java自学之I/O编程

    I/O(Input/Output,输入/输出)可以实现数据的读取与写入操作,Java针对I/O操作的实现提供了java.io工具包,此包的核心组成由File类、InputStrea…

    2020年12月21日
    1.1K
  • STS插件mybatis-generator安装及使用

    断断续续学习Java也有好长时间了,没有师傅带,没有项目练手,学习超级慢,也很烦。视频、书籍翻看了一大推,还是没有目标。 相信滴水成海,外加条条大路通罗马,只要坚持,自己终能达成目…

    2019年12月27日
    2.1K
  • Java自学之异常的捕获与处理

    在程序开发中,程序的编译与运行是两个不同的阶段,编译主要针对的是语法检测,而在程序运行时却有可能出现各种各样的错误导致程序中断执行,那么这些错误在Java中统一称为异常。 异常处理…

    2020年12月11日
    1.2K
  • JAVA学习路线之夯实基础

    第一章 开发环境 JDK(Java SE Development Kit),Java标准版开发包,提供编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环…

    2020年1月14日
    1.5K
  • Java自学之类与对象

    定义 类是由成员属性和方法组成。成员属性主要定义类的一个具体信息,实际上一个成员属性就是一个变量,而方法是一些操作的行为。类的定义基础语法如下。 一个类定义完成后并不能够被直接使用…

    2020年11月25日
    1.1K
  • Java自学之继承

    在面向对象的设计过程中,类是基本的逻辑单位。但是对于这些基本的逻辑单位需要考虑到重用的设计问题,所以在面向对象的设计里提供有继承,并利用这一特点实现类的可重用性定义。 类继承定义 …

    2020年12月3日
    1.2K
  • spring4.x学习之创建工程

    断断续续学习Java有两三个月了,目前还是处于入门阶段。关于java及spring那些的设计理念方面的理论知识,不花费大量精力及时间是看不懂的(至少对于我这么一个前端转后端的初学者…

    2019年3月19日
    1.7K
  • spring boot练习篇之用户登录系统【接入数据库】

    抛弃JSP,只做纯粹的前后端分离项目。 写在前面 学习基础知识是枯燥无味的,之所以会这样,多数是因为心不静,对于如何运用它,感到茫然。所以建议大家在学习Java基础知识的时候,一定…

    2021年5月28日
    1.1K

发表回复

Please Login to Comment