乡村建设网站,淘宝怎样优化关键词,本地app开发公司,凡科怎样免费做网站一、Java 8 增强的包装类 Java是面向对象的编程语言#xff0c;但它也包含了8种基本数据类型#xff0c;这8种基本数据类型不支持面向对象的编程机制#xff0c;基本数据类型的数据也不具备对象的特性。#xff08;没有成员变量、方法可以被调用#xff09;。Java之所以提…一、Java 8 增强的包装类 Java是面向对象的编程语言但它也包含了8种基本数据类型这8种基本数据类型不支持面向对象的编程机制基本数据类型的数据也不具备对象的特性。没有成员变量、方法可以被调用。Java之所以提供这8种数据类型主要是为了照顾程序员的传统习惯。
基本数据类型的限制 所有的引用类型的变量都继承了Object类都可以当成Object类型变量使用。但基本数据类型的变量就不可以。
解决办法 为了解决8种基本数据类型不能当成Object类型变量使用的问题Java提供了包装类的概念为8种基本数据类型发呢别定义了相应的引用类型。
对应关系
基本数据类型包装类byteByteshortShortintIntegerlongLongcharCharacterfloatFloatdoubleDoublebooleanBoolean
自动装箱
可以把一个基本类型变量直接赋给对应的包装类变量或者赋给Object变量。
自动拆箱
允许直接把包装类对象赋给一个对应的基本类型变量。
public class AutoBoxingUnboxing {public static void main(String[] args) {//自动装箱//直接把一个基本类型变量赋给Integer对象Integer inObj 5;//直接把一个boolean类型变量献给一个Object类型的变量Object boolObj true;//自动拆箱直接把一个Integer对象赋值给int类型的变量int a inObj;if (boolObj instanceof Boolean) {//先把Object对象强制类型转换为Boolean类型再赋给boolean对象boolean b (Boolean)boolObj;System.out.println(b);}}
}字符串类型—— int 类型 String str 123;int b Integer.parseInt(str);int c new Integer(str);System.out.println(bb);System.out.println(cc);
int 类型—— String类型 String s String.valueOf(b);System.out.println(s.getClass()); //或者直接和空串相连String ss c ;System.out.println(ss.getClass());
注意问题
这是因为在 -128~127之间的数字同 一个整数自动装箱成Integer实例时引用的是cache数组的同一个数组元素所以它们全都相等。而不在这个范围内的每次自动装箱的时候都会新创建一个Integer实例所以两个会不相等。 Integer ia 2;Integer ib 2;System.out.println(ia ib); //trueInteger ic 128;Integer id 128;System.out.println(ic id); //false
二、处理对象
1. 打印对象和 toString 方法
对于一个Person对象 p使用这两种方式效果一样
System.out.println(p);
System.out.println(p.toString());
Object类提供的 toString() 方法总是返回该对象实现类的“类名hashCode”。
2. 和 equals方法 如果两个变量是基本类型变量且都是数值类型只要两个变量的值相等就返回true。 但是对于两个引用类型变量只有它们指向同一个对象时判断才会返回true。
equalsequals() 方法是Object 类提供的一个实例方法因此所有引用变量都可以调用该方法来判断是否与其他引用变量相等但是使用这个方法判断两个对象相等的标准与使用运算符没有区别同样要求引用变量指向同一个对象才会返回true。更多情况我们都选择重写equals方法。
注意String类已经重写了equals()方法。
例如 public boolean equals(Object obj) {if (this obj) {return true;}if (obj ! null obj.getClass() Person.class) {Person personObj (Person)obj;if (this.getId().equals(personObj.getId())) {return true;}}return false;}
三、final修饰符 final关键字可用于修饰类、变量和方法。final修饰变量时表示该变量一旦获得初始值就不可被改变。
1. final成员变量
成员变量随类初始化或对象初始化而初始化的final修饰的成员变量必须由程序员显式地指定初始值。
2. final局部变量
系统不会对局部变量进行初始化局部变量必须由程序员显式初始化因此使用final修饰局部变量时既可以在定义时指定默认值也可以不指定默认值。
3. final修饰基本类型变量和引用类型变量的区别
final修饰基本类型变量时不能对基本类型变量重新赋值但对于引用类型变量而言它保存的仅仅是一个引用final只保证这个引用类型变量所引用的地址不会改变即一直引用同一个对象但是这个对象完全可以发生改变。
4. final类
final类不能有子类Java.lang.Math就是一个final类。
四、抽象类 当编写一个类时常常会为该类定义一些方法这些方法用以描述该类的行为方式那么这些方法都有具体的方法体。但是有的类只知道其子类应该包含什么样的方法但不知道具体内容这就是抽象类。抽象方法是只有方法的定义没有具体实现的方法。
1. 抽象方法和抽象类 抽象方法和抽象类必须用 abstract 修饰。规则如下
抽象方法不能有方法体抽象类不能被实例化不能new抽象类可以包含成员变量、方法、构造器、初始化块、内部类5种成分。抽象类的构造器不能创建实例主要是用于被其子类调用含有抽象方法的类只能被定义为抽象类
当使用 static 修饰一个方法时表明这个方法属于该类本身即通过类就可以调用该方法。static和abstract不能同时修饰某个方法但是它们可以同时修饰内部类。
abstract 修饰的方法不能被定义为private因为它需要被重写。
2. 抽象类的作用 抽象类体现的就是一种模板模式的设计抽象类作为多个子类的通用模板子类在抽象类的基础上进行扩展、改造但子类总体上会大致保留抽象类的行为方式。 如果编写一个抽象父类父类提供了多个子类的通用方法并把一个或多个方法留给其子类实现这就是一种模板模式模板模式也是十分常见且简单的设计模式之一。
五、Java 8 改进的接口 抽象类是从多个类种抽象出来的模板如果将这种抽象进行的更彻底则可以提炼出一种更加特殊的“抽象类”——接口接口里不能包含普通方法接口里的所有方法都是抽象方法Java8对接口进行了改进允许在接口种定义默认方法默认方法可以提供方法实现。 接口里不能包含构造器和初始化块定义接口里可以包含成员变量只能是静态常量方法只能是抽象方法、类方法或默认方法、内部类包含内部接口、枚举定义。
在接口里下面两行代码含义一样
int MAX_SIZE 50;
public static final int MAX_SIZE 50;
1. 接口的继承
interface interfaceC extends interfaceA, interfaceB{}
2. 接口的作用 定义变量也可用于进行强制类型转换 调用接口种定义的常量 被其他类发现
实现接口
修饰符 class 类名 extends 父类 implements 接口1接口2{} 3. 接口和抽象类
接口和抽象类很像他们都具有如下特征
接口和抽象类都不能被实例化他们都位于继承树的顶端用于被其他类实现和继承接口和抽象类都可以包含抽象方法实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
接口和抽象类的区别
接口里不包含构造器抽象类里可以包含构造器抽象类里的构造器并不是用于创建对象而是让其子类调用这些构造器来完成属于抽象类的初始化操作接口里不能包含初始化块抽象类可以包含
六、内部类 大部分时候类被定义为一个独立的程序单元在某些情况下也会把一个类放在另一个类的内部定义这个定义在其他类内部的类就被称为内部类。
1. 内部类作用 内部类提供了更好的封装可以把内部类隐藏在外部类之内不允许同一个包种的其他类访问该类。如Cow类和CowLeg类CowLeg只有在Cow类里面才有意义所以可以把他定义在Cow里面当作内部类。 内部类成员可以直接访问外部类的私有数据因为内部类被当作其外部类成员。 匿名内部类适合用于创建那些仅需要一次使用的类。
2. 非静态内部类
定义内部类
public class OuterClass {private class interClass{}
} 如果外部类需要访问非静态内部类的成员则必须显示创建非静态内部类对象来调用访问其实例成员。 3. 静态内部类 如果用static修饰一个内部类则这个内部类就属于外部类本身而不属于外部类的某个对象。因此用static修饰的内部类被称为类内部类。 static的作用是把类的成员变成类相关而不是实例相关。即static修饰的成员属于整个类而不属于单个对象。
4. 局部内部类 如果把一个内部类放在方法里定义则这个内部类就是一个局部内部类局部内部内仅在方法里有效。
5. 匿名内部类 匿名内部类适合创建那种只需要一次使用的类创建匿名内部类时会创建以恶该类的实例这个类定义立即消失匿名内部类不能重复使用。
示例
public interface MyInterface {void doSomething();
}public class MyClass {public static void main(String[] args) {// 创建一个实现MyInterface接口的匿名内部类MyInterface myInterface new MyInterface() {Overridepublic void doSomething() {System.out.println(Doing something...);}};// 调用doSomething方法myInterface.doSomething();}
}在上述示例中我们定义了一个接口MyInterface和一个类MyClass。在MyClass中的main方法中我们使用匿名内部类创建了一个实现MyInterface接口的对象。在这个匿名内部类中我们重写了MyInterface中的doSomething方法当调用myInterface.doSomething()时它将输出Doing something...。 匿名内部类必须继承一个父类或实现一个接口但最多只能继承一个父类或实现一个接口。
6. 枚举类 在某些情况下一个类的对象是有限而且固定的比如季节类它只有四个对象。这种实例有限而且固定的类在Java里被称为枚举类。
定义一个季节的枚举类
public enum Season {SPRING,SUMMER,AUTUMN,WINTER
}使用枚举类
public class Main {public static void main(String[] args) {Season currentSeason Season.SPRING;System.out.println(当前季节是 currentSeason);switch (currentSeason) {case SPRING:System.out.println(现在是春天);break;case SUMMER:System.out.println(现在是夏天);break;case AUTUMN:System.out.println(现在是秋天);break;case WINTER:System.out.println(现在是冬天);break;}}
}输出
当前季节是SPRING
现在是春天7. 对象与垃圾回收 Java垃圾回收时Java语言的重要功能之一。当程序创建对象、数组等引用类型实体时系统都会在堆内存中为之分配一块内存区对象就保存在这块内存区中当这块内存不再被任何引用变量引用时这块内存就变成垃圾等待垃圾回收机制进行回收。垃圾回收机制具有如下特征
垃圾回收机制只负责回收堆内存中的对象不会回收任何物理资源如数据库连接、网络和IO程序无法精确控制垃圾回收的运行垃圾回收会在合适的时候进行。当对象永久性的失去引用后系统就会在合适的时候回收它所占的内存。在垃圾回收机制回收任何对象之前总会先调用它的finalize() 方法。
强制垃圾回收 在Java中我们不能确保垃圾回收器什么时候会执行因为这是由JVM自行管理的。但是我们可以通过调用System.gc()或者Runtime.getRuntime().gc()方法来提示垃圾回收器尽快执行垃圾回收操作。 需要注意的是虽然调用System.gc()或者Runtime.getRuntime().gc()方法可以请求垃圾回收器进行垃圾回收操作但是它们不能保证垃圾回收器一定会执行。这是因为JVM在进行垃圾回收时有可能会优化执行时间避免过多频繁的垃圾回收操作因此这些方法调用只能作为提示而不能作为强制垃圾回收的手段。 同时需要注意的是在实际应用中应该避免频繁地调用垃圾回收操作因为这会占用系统资源影响程序的性能。通常情况下我们可以通过优化程序代码、避免创建过多无用的对象等方式来减少垃圾回收的执行次数提高程序的性能。