No.1、java继承(部分-3)

1、对象包装器与自动装箱

有时, 需要将 int 这样的基本类型转换为对象。所有的基本类型都冇一个与之对应的类。

例如,Integer 类对应基本类型 int。

通常, 这些类称为包装器 ( wrapper) 这些对象包装器类 拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character、Void 和 Boolean (前 6 个类派生于公共的超类 Number)。

对象包装器类是不可变的,即一旦构造了包装器,就不 允许更改包装在其中的值。同时, 对象包装器类还是 final, 因此不能定义它们的子类。

自动装箱过程

ArrayList<Integer> list = new ArrayList<>()//过程1,自动等同于下面过程2
list.add(3);
//过程2
list.add (Integer.valueOf(3));

int类型自动装箱成Integer类型,相反地, 当将一个 Integer 对象赋给一个 int 值时, 将会自动地拆箱。

自动拆箱过程

int n = list.get(i);
//等同于下面这条语句
int n = list.get(i).intValue();

注意:
== 运算符也可以应用于对象包装器对象, 只不过检测的是对象是否指向同一个存储区域, 因此,下面的比较通常不会成立:

Integer a = 1000;
Integer b = 1000;
if (a = b) . . .

解决这个问题的办法是在两个包装器对象比较时调用 equals 方法。

2、参数数量可变的方法

public PrintStream printf(String fmt , Object... args) { 
return format(fmt, args); 

这里的省略号 . . . 是 Java 代码的一部分,它表明这个方法可以接收任意数量的对象(除 fmt参数之外)。

实际上,printf方法接收两个参数,一个是格式字符串, 另一个是 Object 数组, 其中保存着所有的参数(如果调用者提供的是整型数组或者其他基本类型的值, 自动装箱功能将把它们转换成对象 )。

换句话说,对于 printf 的实现者来说,Object…参数类型与 Object[ ]完全一样。

例子:

public static double max (double... values)
{
	double largest = Double.NECATIVEJNFINITY;
	for (double v : values) if (v > largest) 			
		largest = v;
	return largest;
}

调用该方法的方式,编译器将 new double[ ] {3.1, 40.4,-5} 传递给 max 方法。

double m = max(3.1, 40.4, -5);

需要注意的是,“…”形式的变参只能是方法参数列表中的最后参数。

3、枚举类

public enum Size
{
	SMALLfS"), MEDIUMC'M"), LARGEfL"), EXTRA_LARGE("XL");
	private String abbreviation;
	private Size(String abbreviation) { 		
	this,abbreviation = abbreviation; }
	public String getAbbreviation() { 
		return abbreviation; }
}

所有的枚举类型都是 Enum 类的子类。它们继承了这个类的许多方法。

其中最有用的一个是 toString, 这个方法能够返回枚举常量名。

toString 的逆方法是静态方法 valueOf。

例如, 下面语句:

Size s = Enum.valueOf(Size,class, "SMALL");

将 s 设置成 Size.SMALL。
在这里插入图片描述

4、反射

反射库( reflection library) 提供了一个非常丰富且精心设计的工具集, 以便编写能够动态操纵 Java 代码的程序。这项功能被大量地应用于 JavaBeans 中, 它是 Java组件的体系结构。

能够分析类能力的程序称为反射(reflective )。
反射机制的功能极其强大,在下面可以看到, 反射机制可以用来:

•在运行时分析类的能力。

•在运行时查看对象, 例如, 编写一个 toString 方法供所有类使用。

•实现通用的数组操作代码。

•利用 Method 对象, 这个对象很像中的函数指针。

1、class类
Object 类中的 getClass( ) 方法将会返回一个 Class 类型的实例。

Employee e;
Class cl = e.getClass();

最常用的 Class 方法是 getName。 这个方法将返回类的名字。

System.out.println(e.getClass().getName() + " " + e.getName());

还可以调用静态方法 forName 获得类名对应的 Class 对象。这个方法只有在 dassName 是类名或接口名时才能够执行。否则,forName 方法将抛出一个 checked exception ( 已检查异常)。

String dassName = "java.util .Random";
Class cl = Class.forName(dassName);

无论何时使用这个方法, 都应该提供一个异常处理器( exception handler)。

获得 Class类对象的第三种方法非常简单。如果 T 是任意的 Java 类型(或 void 关键字,)
T.class 将代表匹配的类对象。

Class dl1 = Random.class; // if you import java.util
Class cl2 = int.class;
Class cl3 = Doublet[].class;

可以利用 =运算符实现两个类对象比较
的操作。

if (e.getClass()==Employee.class) . . .

方法 newlnstance( ), 可以用来动态地创建一个类的实例。

e.getClass0.newlnstance();

newlnstance方法调用默认的构造器(没有参数的构
造器)初始化新创建的对象。如果这个类没有默认的构造器, 就会抛出一个异常。

将 forName 与 newlnstance 配合起来使用, 可以根据存储在字符串中的类名创建一个对象。

String s = "java.util .Random";
Object m = Class.forName (s) .newlnstance();

1、利用反射分析类
在 java.lang.reflect 包中有三个类 Field、 Method 和 Constructor 分别用于描述类的域、 方法和构造器。

这三个类都有一个叫做 getName 的方法, 用来返回项目的名称。

Field 类有一个 getType 方法, 用来返回描述域所属类型的 Class 对象。

Method 和 Constructor 类有能够报告参数类型的方法,Method 类还有一个可以报告返回类型的方法。这个类还有一个叫做 getModifiers 的方法, 它将返回一个整型数值,用不同的位开关描述 public 和 static 这样的修饰符使用状况。

另外, 还可以利用java.lang.refleCt 包中的 Modifiei•类的静态方法分析getModifiers 返回的整型数值。

例如, 可以使用 Modifier 类中的 isPublic、 isPrivate 或 isFinal判断方法或构造器是否是 public、 private 或 final。 我们需要做的全部工作就是调用 Modifier类的相应方法,并对返回的整型数值进行分析,另外,还可以利用 Modifier.toString方法将修饰符打印出来。

5、继承的技巧

  1. 将公共操作和域放在超类
  2. 不要使用受保护的域
    protected 机制并不能够带来更好的保护,其原因主要有两点。
    第一,子类集合是无限制的, 任何一个人都能够由某个类派生一个子类,并编写代码以直接访问 protected 的实例域, 从而破坏了封装性。
    第二, 在 Java 程序设计语言中,在同一个包中的所有类都可以访问 proteced 域,而不管它是否为这个类的子类。
  3. 使用继承实现“ is-a” 关系
  4. 除非所有继承的方法都有意义,否则不要使用继承
  5. 在覆盖方法时,不要改变预期的行为
  6. 使用多态, 而非类型信息
  7. . 不要过多地使用反射
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您在访问`/swagger-ui.html`时出现了`No mapping for GET`错误。这个错误通常是由于您的应用程序缺少相应的请求映射所引起的。 要解决这个问题,您可以尝试以下几个步骤: 1. 确保您的应用程序中已经正确配置了Swagger相关的依赖项。您可以在`pom.xml`文件中添加以下依赖项: ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> ``` 或者,如果您使用Gradle构建工具,则可以在`build.gradle`文件中添加以下依赖项: ```groovy implementation 'io.springfox:springfox-swagger2:2.9.2' implementation 'io.springfox:springfox-swagger-ui:2.9.2' ``` 2. 确保您的应用程序中已经正确配置了Swagger的相关配置类。您可以创建一个继承自`WebMvcConfigurationSupport`的配置类,并重写`addResourceHandlers`方法,将Swagger的资源路径添加到资源处理程序中。例如: ```java @Configuration @EnableSwagger2 public class SwaggerConfig extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } } ``` 3. 确保您的应用程序中已经正确配置了Swagger的API文档。您可以创建一个Swagger配置类,并使用`@Api`和`@ApiOperation`等注解来定义API接口和操作。例如: ```java @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.example.controller")) .paths(PathSelectors.any()) .build(); } } ``` 请根据您的具体情况检查以上步骤,并确保正确配置了Swagger相关的依赖项、配置类和API文档。如果问题仍然存在,请提供更多详细信息以便我能够更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值