Java 语言特性
介绍以下几种语言特性:
Java5的特性
1.静态引用
2.可变参数
3.自动装箱和拆箱 包装类的缓存设计
4.枚举
一、静态引用(语法糖,不推荐使用,了解一下即可)
先看看普通的引用,就是import
package com.StadyJava.day22;
import java.util.Collections;
public class LoadResourceDemo {
public static void main(String[] args) throws Exception{
Collections.emptyList();
Collections.emptyList();
Collections.emptyList();
Collections.emptyList();
}
}
我打Collections.emptyList(); Idea编译器会自动的帮我引用 java.util.Collections
可以看到,我使用了4次emptyList()方法,那么假如我下面还要使用emptyList()很多次,我每次都要写Collections,感觉很麻烦,所以静态引用就出来了,看代码
package com.StadyJava.day22;
import static java.util.Collections.*;
public class LoadResourceDemo {
public static void main(String[] args) throws Exception{
emptyList();
emptyList();
emptyList();
emptyList();
}
}
现在我直接写emptyList()就可以了,当做是我自己的方法了。而且通过反编译代码发现,底层还是使用了Collections.emptyList();,所以静态引用就是一个语法糖。
而且容易混淆,也不知道这个方法到底是哪个类的,所以静态引用不要使用,了解一下得了。
二、可变参数 (就是一个语法糖)
该说的没什么说的了,全在代码和注释里面。我写了一个商品类,然后写了一个可变参数类,看看吧
商品类,这里面字段是自己写的,构造器和属性都是使用Generate自己生成的:
package com.StadyJava.day24;
public class GoodsDemo {
//商品名称,价格和数量
private String name;
private Integer price;
private Integer number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public GoodsDemo() {
}
public GoodsDemo(String name, Integer price, Integer number) {
this.name = name;
this.price = price;
this.number = number;
}
}
可变参数类:
package com.StadyJava.day24;
public class VarArgsDemo {
public static void main(String[] args) {
GoodsDemo goodsDemo1=new GoodsDemo("许嵩的专辑",50,1000);
GoodsDemo goodsDemo2=new GoodsDemo("林俊杰的专辑",20,1000);
GoodsDemo goodsDemo3=new GoodsDemo("蜀云泉的专辑",1,1);
//调用可恶的方法1
System.out.println(sum1(goodsDemo1,goodsDemo2,goodsDemo3));
//方法2,创建一个数组来
GoodsDemo [] goodsDemos={goodsDemo1,goodsDemo2,goodsDemo3};
System.out.println(sum2(goodsDemos));
//方法3,试试语法糖好吃不
System.out.println(sum3(goodsDemo1,goodsDemo2,goodsDemo3));
}
//我们设计一个方法,求买的东西的价格总和。如果没有可变参数,我们会怎么办?
//方法1,写死参数
private static Integer sum1(GoodsDemo arg1,GoodsDemo arg2,GoodsDemo arg3){
return arg1.getPrice()*arg1.getNumber()+arg2.getPrice()*arg2.getNumber()+arg3.getPrice()*arg3.getNumber();
}
//方法2,创建一个数组,来存放参数
private static Integer sum2(GoodsDemo[] arg){
Integer msg=0;
for (GoodsDemo good:arg) {
msg += good.getPrice() * good.getNumber();
}
return msg;
}
//方法3,使用可变参数的方式,其实可变参数的方式,底层还是数组。说白了就是一个语法糖而已。使用方法就是...
//注意!!!使用可变参数的方式时,如果有其它的参数,一定要把可变参数放在最后!一定要把可变参数放在最后!!!
private static Integer sum3(GoodsDemo ... arg){
Integer msg=0;
for (GoodsDemo good:arg) {
msg+=good.getPrice()*good.getNumber();
}
return msg;
}
}
三、自动装箱和拆箱 包装类的缓存设计
自动装箱和拆箱我不想讲,还是语法糖。只不过不需要你自己去转换类型了。讲讲包装类的缓存设计。
包装类的缓存设计:
Byte,short,Integer,Long.缓存范围:[-128,127]
Charactor: 缓存范围:[0,127]
在这个范围之内的可以直接拿来使用的,看个代码:
public static void main(String[] args) throws Exception{
//new出来的内存地址都不一样,所以比较的时候一定是false
Integer num1=new Integer(17);
Integer num2=new Integer(17);
System.out.println(num1==num2);
//Valueof的底层,-128到127之间是缓存中读取,范围之外的new
Integer num3=Integer.valueOf(17);
Integer num4=Integer.valueOf(17);
System.out.println(num3==num4);
//-128到127之间都是true,之外都是false,这个和上面的差不多
Integer num5=17;
Integer num6=17;
System.out.println(num5==num6);
//上面的比较都用==,这里用equals方法,本质就是intValue
Integer num7=200;
Integer num8=200;
System.out.println(num7.equals(num8));
//System.out.println(num7.intValue()==num8.intValue());
}
给你们看看Valueof的底层
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
就是缓存。
四、枚举(语法糖)
讲枚举之前,我们先来看看一个代码例子,一周有7天,我现在要让一个员工输入休息的是哪一天,输出一些内容,用到了3个类,看看
员工类:
package com.StadyJava.day24;
public class Employee {
private WeekDay restDay;
public WeekDay getRestDay() {
return restDay;
}
public void setRestDay(WeekDay restDay) {
this.restDay = restDay;
}
}
员工类就一个周类型的字段和构造
周类:
package com.StadyJava.day24;
public class WeekDay {
//这个一周7天,写成这种数字的形式,1,2,3,...但是数字这种无法保证别人乱输,所以不要使用数字了
//public Integer Mon=1;
public static final WeekDay Mon=new WeekDay();
public static final WeekDay Tue=new WeekDay();
public static final WeekDay Wen=new WeekDay();
public static final WeekDay Thu=new WeekDay();
public static final WeekDay Fri=new WeekDay();
public static final WeekDay Sta=new WeekDay();
public static final WeekDay Sun=new WeekDay();
//我这里设置构造函数为私有的,就不能传入new WeekDay对象了,只能调用我写好的对象
private WeekDay(){}
}
这个类,我没有设置int类型的1,2,3...因为在输入的时候,别人可以乱输入数字的,我还得判断。直接设置成这个
调用台:
package com.StadyJava.day24;
public class EnumDemo {
public static void main(String[] args) {
Employee e =new Employee();
//由于这里可以传入new WeekDay()的空对象,所以我把构造函数设置为私有的了
e.setRestDay(WeekDay.Mon);
if (e.getRestDay() == WeekDay.Sta||e.getRestDay()==WeekDay.Sun) {
System.out.println("周末休息");
}
else {
System.out.println("周一至周五休息");
}
}
}
这就是我的调用台代码
这样就可以实现,员工输入自己哪一天休息的,然后输入一些内容。
讲真,WeekDay这个类写起来还是稍微耗时间的,所以有了枚举,我们看看枚举是怎么写的
package com.StadyJava.day24;
public enum WeekDay {
Mon,Tue,Wen, Thu,Fri, Sta,Sun;
}
完事...枚举就是为了解决这个问题而存在的,所以枚举适用的场景就是固定的个数的时候。
枚举底层的代码,经过反编译之后,和 public static final WeekDay Mon=new WeekDay(); 是一样滴,所以枚举也是一个语法糖。
Java 语言特性的更多相关文章
- java语言特性概述
一.前言 我们都知道java是面向对象的编程,其中四个基本特性:抽象.封装.继承.多态.这四个特性,概括起来可以这么理解,抽象.封装.继承是多态的基础,多态是抽象.封装.继承的表现. 二. JAVA ...
- [原]Java修炼 之 基础篇(一)Java语言特性
学习软件开发,首先要选择的就是选择需要采用的编程语言,考虑语言本身的优缺点和实际需求,综合评价之后选择相关的语言进行系统开发.本篇博客开始就从近年来比较流行的Java开始为大家讲起. 背景 1995年 ...
- Java语言特性
Java的语言特性: 1.语法相对简单 2.面向对象 3.分布性 4.可移植性 5.安全性 6.健壮性 7.解释性 8.多线程 9.动态性与并发性 Java中的面向对象编程: 面向对象程序设计(Obj ...
- Java语言特性、加载与执行
[开源.免费.纯面向对象.跨平台] 简单性: 相对而言,例如,Java是不支持多继承的,C++是支持多继承的,多继承比较复杂:C++ 有指针,Java屏蔽了指针的概念.所以相对来说Java是简单的. ...
- 【Java语言特性学习之三】Java4种对象引用
为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为(引用的级别和强度由高到低)强引用.软引用.弱引用.虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使 ...
- 【Java语言特性学习之一】设计模式
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- Java 语言特性之 Annotation 注解
利用 Java 的反射机制,可以在运行时获取 Java 类的注解信息. 注解 注解的特性 注解是 Java 5 的一个新特性,是插入代码中的一种注释或者说是元数据.注解并不是程序代码,可以对程序作出解 ...
- java语言特性之一
package java.util.Collections; public static int indexOfSubList(List<?> source, List<?> ...
- 【Java语言特性学习之六】扩展知识点
一.SPI机制 二.注解处理机制 三.java native关键字 https://www.cnblogs.com/KingIceMou/p/7239668.html
随机推荐
- BZOJ2565最长双回文串——manacher
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...
- 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...
- thymeleaf中js跳转到另外一个页面
<script type="text/javascript"> setTimeout("location.href='index'", 3000); ...
- 【BZOJ4868】[六省联考2017]期末考试(贪心)
[BZOJ4868][六省联考2017]期末考试(贪心) 题面 BZOJ 洛谷 题解 显然最终的答案之和最后一个公布成绩的课程相关. 枚举最后一天的日期,那么维护一下前面有多少天可以向后移,后面总共需 ...
- Vue中的slot内容分发
①概述: 简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示.不显示.在哪个地方显示.如何显示,就是slot分发负责的活. ②默认情况下 父组件在子组件内套的内容,是不显示的. 例如 ...
- Apache rewrite地址重写
Apache-rewrite+13个经典案例Apache 重写规则的常见应用(rewrite)一:目的 如何用Apache重写规则来解决一些常见的URL重写方法的问题,通过常见的 实例给用户一些使用重 ...
- Paint the Wall ZOJ - 2747
点数很多,坐标值很大,然后离散化一下用一个点表示一小块的面积对应的颜色,然后更新的时候一块一块更新,查询的时候一块一块查询 #include<map> #include<set> ...
- 【php】php目录路径函数系列
在写框架和项目时候我们经常要获取绝对路径,php有内置函数realpath(), 也可以写个函数来实现这个功能 function getAbsolutePath($path) { $path = s ...
- 【linux】vim常用操作及vim插件的安装使用
vim是linux下一个非常好用的文本编辑器,在linux下开发的人员要熟练掌握vim常用命令. 1. 打开在第n行 vim +143 filename.txt 2. 只读模式打开 vim -R / ...
- HTML 5 canvas globalCompositeOperation 属性
做一个canvas鼠标跟随动画的时候用到了,就copy w3c的解释整理一番: globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上. 源 ...