包装类、object、单例模式、final、抽象类
/*包装类*/ /* byte Byte short Short int Integer long Long char Character float Float double Double boolean Boolean
基本数据和其包装类:作为成员变量时的默认初始值的差异: int -- Integer 0 null */ class WrapDemo { public static void main(String[] args) {
//包装类对象 /* 把基本数据类型包装类除了 Character类之外,其他的7个都有两个构造方法
基本数据类型xx; xx对应包装类的构造方法: public xx的包装类(xx x){} public xx的包装类(String x){}
这里传递的x值表示该包装类型对象的值; Integer i = new Integer(17);//i = 17 i = new Integer("123");// i = 123 使用第二种构造方法可能会引发 类型转换异常; Integer:凡是涉及到整数的操作,Integer类里都有相应的方法来处理;
Character类没有public Character(String c){}
*/ Boolean b = new Boolean("tRuE");//除了true之外(不区分大小写),其他的默认都是false
/* static Boolean FALSE 对应基值 false 的 Boolean 对象。 static Boolean TRUE 对应基值 true 的 Boolean 对象。
*/ b = Boolean.FALSE;//FALSE == new Boolean(false); System.out.println("b= " + b);
//十进制和 二进制,八进制,十六进制的转换
/* Integer: 有3个静态的方法可以完成: static String toBinaryString(int i) 以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。 static String toHexString(int i) 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。 static String toOctalString(int i) 以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。 */ System.out.println(Integer.toBinaryString(-100)); //byte byteValue() 以 byte 类型返回该 Integer 的值。 Integer i = new Integer(17); byte by = i.byteValue(); System.out.println(by); /* int compareTo(Integer anotherInteger)在数字上比较两个 Integer 对象。 */
System.out.println(i.compareTo(new Integer(12)));//1 /* int intValue() 以 int 类型返回该 Integer 的值。
包装类 -->基本类型: 调用xxxValue(); int ret = age.intValue();
基本类型 -->其包装类
new 包装类(基本类型的值); new Integer(17); */
int age = i.intValue();
/* static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析。
String --> 基本类型 */ age = Integer.parseInt("17"); /* static Integer valueOf(int i) 基本类型 -->包装类类型 和 new Integer(int i); 返回一个表示指定的 int 值的 Integer 实例。 static Integer valueOf(String s) String --> Integer: new Integer(String s); 返回保存指定的 String 的值的 Integer 对象。
*/ //static boolean isDigit(char ch) 确定指定字符是否为数字。 //判断的是0 ~9之间的数字 System.out.println(Character.isDigit('A'));//false char c = '8';// System.out.println(Character.isDigit(c));
String s = "1214542S"; System.out.println("----------------"); int i1 = 12; int i2 = 12;
System.out.println(i1 == i2);//相等
Integer in1 = new Integer(12); Integer in2 = new Integer(12);
System.out.println(in1 == in2);//不相等的,两个对象
in1 = 12; in2 = 12; System.out.println("--->"+(in1 == in2));//true /* 这里涉及到了一个享元模式: 只缓存[-128,127]区间的数字,Byte,Short,Integer,Long 都是一样的 */ in1 = 128; in2 = 128; System.out.println("--->"+(in1 == in2));//true
/* 装箱和拆箱:
int Integer 装箱: 把基本数据类型 --> 它所对应的包装类类型 Integer i = new Integer(int value);
拆箱: 包装类类型 --> 它所对应的把基本数据类型 int i2 = i.intValue();
Java5开始提供了自动装箱和拆箱的功能; 自动装箱: 可以把一个基本数据类型的值直接赋给 其包装类对象 Integer age = 17;
Object就可以接受一切类型了; Object o = false; o = 123; 自动拆箱: 可以把一个包装类对象直接赋给一个基本数据类型的变量 int age2 = age;
*/
Integer age2 = 17;
int age3 = age2;
} }
class ObjectDemo { /* 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 */ public static void main(String[] args) {
String[][] arr = {{"A"}};
Object o = arr; System.out.println(arr.getClass()); /* 常见方法:
boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。 equlas默认的比较的是 堆里地址,和 == 一样,都是比较地址
有的时候我们不需要比较地址,比如有的时候我们不关心地址,只关心值,咋办? 此时就要求子类去覆写该方法
比如Integer类: public boolean equals(Object obj) { if (obj instanceof Integer) { return this.value == ((Integer)obj).intValue(); } return false; }
int hashCode() 返回该对象的哈希码值。
String toString() 返回该对象的字符串表示。
*/
//equals
System.out.println(new Integer(1).equals(new Integer(1)));//true System.out.println(new Object().equals(new Object()));//false
System.out.println(new String() == new String());//false System.out.println(new String().equals(new String()));//true
System.out.println(new Object().hashCode());//每个对象的hashCode都会不一样 System.out.println(new Object().hashCode());
Object o1 = new Object();
System.out.println(o1.hashCode()); System.out.println(o1.hashCode()); /* String toString() 返回该对象的字符串表示 以字符串的形式描述了对象状态;//描述对象
hexHashCode 我们打印对象,其实打印的是对象的toString()方法 对象类型的全限定名 + @ + 对象十六进制的hashCode
一般情况下建议每个类都覆写toString()
对象 --> String
本质上打印对象,其实就是在打印对象的toString()方法 */ ObjectDemo od = new ObjectDemo(); System.out.println(od);//ObjectDemo@c05d3b System.out.println(od.toString());//ObjectDemo@c05d3b int hashCode = od.hashCode();// //static String toHexString(int i) 转16进制 String hexHashCode = Integer.toHexString(hashCode);
System.out.println(hexHashCode);
System.out.println(new Person("Will","男",17).toString()); System.out.println(new Person("Lucy","女",15));
Object p = new java.util.Date();
System.out.println("p.getClass()-->"+p.getClass().getName()); } }
class Person {
private String name; private String gender;
private Integer age; public Person(String name,String gender,Integer age) { this.name = name; this.gender = gender; this.age = age; } @Override//表示覆写 public String toString() { return "[ name= " + this.name +",性别= " + this.gender +", 年龄= " + this.age +"]"; } }
/*
普通代码块
*/
class CodeDemo1
{
public static void main(String[] args)
{
{
//普通代码块
int a = 10;
System.out.println("--->" + a);
}
//System.out.println(a);//访问不到
}
}
/* 构造代码块: 定义在 类里面,方法外面:
直接写在类中的代码块: 优先于构造方法执行,每次实例化对象之前都会执行构造代码块。 */ class CodeDemo2 {
public CodeDemo2(){ System.out.println("构造方法"); }
{ System.out.println("构造代码块"); }
public static void main(String[] args) { System.out.println("Main"); new CodeDemo2(); new CodeDemo2(); new CodeDemo2(); System.out.println("Hello World!"); } }
/* 静态代码块: 就是在构造代码块之前,加上一个 static关键字:
使用static 修饰的构造代码块: 优先于主方法执行,优先于构造代码块执行,不管有创建多少对象,静态代码块只执行一次,可用于给静态变量赋值; */
class CodeDemo3 {
static String name ;
public CodeDemo3() { System.out.println("构造方法!"); }
{ System.out.println("构造代码块!"); }
static { name = "AA"; System.out.println("静态代码块!"); } public static void main(String[] args) { System.out.println("Main!"); new CodeDemo3(); new CodeDemo3(); System.out.println("end"); } }
import java.lang.reflect.*;
class Cat { /* 使用private修饰构造方法之后,在该类之外的地方就不能再创建对象了. 结论不一定,因为要把反射除开;
//项目开发经常有这样的一个需求:
某一个对象,只需要存在一个就OK了; 有且只有一个对象;
古代皇帝,
*/ private Cat(){ //super(); System.out.println("cat"); } }
class PrivateDemo {
public static void main(String[] args) throws Exception { Class<Cat> clz = Cat.class; //得到class对象的三种方式之一
Constructor<Cat> c = clz.getDeclaredConstructor();//得到私有私有的构造函数 c.setAccessible(true);//暴力反射 -- 私有的东东就可以在外部进行访问了 Cat cat = c.newInstance();//实际上是调用类里面的无参构造方法创建对象
System.out.println(cat); } }
/* 单例模式: 保证整个项目运作期间某一个对象有且只有一个;
单例模式: 1.饿汉式 2.懒汉式 */
class Singleton { //饿汉式----每次调用的时候不用做创建,直接返回已经创建好的实例。这样虽然节省了时间,但是却占用了空间,实例本身为static的,会一直在内存中带着 private static final Singleton instance;// = new Singleton();
static { instance = new Singleton(); } public static Singleton getInstance() { return instance; } //把构造方法私有化,不允许外界再创建对象 private Singleton(){} }
class Singleton2 { //懒汉式 懒汉式则是判断,在用的时候才加载,会影响程序的速度 ,线程不安全的在并发的情况下。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。 private static Singleton2 instance = null; public static Singleton2 getInstance() { if(instance == null) { instance = new Singleton2(); }
return instance; } private Singleton2(){} }
class SingletoDemo { public static void main(String[] args) { // Singleton s1 = Singleton.instance; // Singleton s2 = Singleton.instance;
Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
Singleton2 s3 = Singleton2.getInstance(); Singleton2 s4 = Singleton2.getInstance();
System.out.println(s3 == s4); } }
final class FinalCLass { }
//class Sub extends FinalCLass {} //FinalDemo.java:5: 错误: 无法从最终FinalCLass进行继承
class Super { //修饰符没有先后关系 final public void show() { } }
class Sub extends Super { //FinalDemo.java:20: 错误: Sub中的show()无法覆盖Super中的show() /**public void show() { } */ }
class FinalDemo { //全局常量 public static final int MAX_VALUE = Integer.MAX_VALUE; public static void main(String[] args) { /* final修饰的变量表示常量: 对常量有一个规范小规定:常量名得全部大写 若该常量名由多个单词组成, 单词字符全部写,而且单词于单词之间使用下划线分割;
public static final int MAX_VALUE
final修饰的变量不能赋值? 最多只能赋值一次,一旦有值之后就不能被修改了;
面试题: 当final修饰一个引用类型变量的时候, 那到底是引用不能变(引用地址不能变),还是引用对象的值不能变呢?
答: 是引用的地址不能变,对象里的内容是可以变的; */
final double PI = 3.14; //pi = 0.618;//FinalDemo.java:38: 错误: 无法为最终变量pi分配值
System.out.println(PI); //说明地址不能变 final String s = new String(); //s = new String();//FinalDemo.java:59: 错误: 无法为最终变量s分配值
//地址不变,但是对象内容的
final StringBuilder sb = new StringBuilder("AAA");//字符串 System.out.println(sb);
sb.append("BBB");//追加 System.out.println(sb);
} }
abstract class OOXX { } /*
抽象方法: 使用abstract修饰的方法,但是没有方法体(没有{}),只有方法声明,抽象方法强制子类覆写
一旦一个类有了抽象方法,那么该类也必须声明为抽象类; 但是抽象类可以没有抽象方法;
抽象类不能实例化,不能创建对象
抽象类必须得有子类,自己的功能才能得以运行;
抽象类的方法只是定义了子类应该具备的行为, 但是没有给出怎么去完成行为的功能代码; 交给子类去根据自身特殊情况去完成该父类声明的功能;
抽象方法也成为 钩子方法; 回调方法
抽象类里可以有普通方法,
抽象类是类的一种特殊情况:据有类的一切特点,但是 不能实例化; 一般的都得带有抽象方法 */
abstract class Tuxing { //建议写在方法的最前面,为了醒目 abstract public double getZC();
public Tuxing(){ // System.out.println("---"); } }
class Sanjiaoxing extends Tuxing { private double a; private double b; private double c; public Sanjiaoxing(double a,double b,double c) { this.a = a; this.b = b; this.c = c; }
//必须覆写 public double getZC(){
//new Tuxing();//ERROR return a + b + c; }
}
//矩形 class Juxing extends Tuxing {
public Juxing() {
super(); } //忘了覆写 public double getZC(){ //new Tuxing();//ERROR return 0; }
} class AbstractDemo2 { public static void main(String[] args) { double ret = new Sanjiaoxing(3,4,5).getZC();//AbstractDemo2.java:35: 错误: Sanjiaoxing是抽象的; 无法实例化 System.out.println(ret); } }
包装类、object、单例模式、final、抽象类的更多相关文章
- JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类
常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...
- 2022-7-23 pan小堂 Object与Final
Object类 1.Object方法 public final native Class<?> getClass() 返回object运行时类 public native int hash ...
- Java接口和抽象类详解
父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ...
- Spring源码分析——BeanFactory体系之抽象类、类分析(二)
上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之 ...
- 由Spring框架中的单例模式想到的
单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 注:Spring源码的版本4.3.4 Spring依赖注入Bean实例默认 ...
- Java探索之旅(15)——包装类和字符类
1.包装类 ❶出于对性能的考虑,并不把基本数据类型作为对象使用,因为适用对象需要额外的系统花销.但是某些Java方法,需要对象作为参数,例如数组线性表ArrayList.add(Object).Jav ...
- Java - 包装类 常量池
概述: 在Java中存在一些基本数据类型,这些基本数据类型变量,不能像其他对象一样调用方法,属性.... 一些情况下带来一些问题,包装类就是为了解决这个问题而出现 包装类可以使得这些基础数据类型,拥有 ...
- 菜鸡的Java笔记 第二十五 wrapperClass 包装类
wrapperClass 包装类 1.包装类的特点 2.装箱与拆箱操作 3.数据转型处理 内容 Object 类可以接收 ...
- Java接口和抽象类的区别
今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...
- 3、Object对象的两大方法(hashCode-equals)总结
Object类是所有java类的父类. 用户定义了如下一个Person类 public class Person{} 在类定义中并没有明确继承Object类,但是编译器会自动的完成这个过程. 既然所有 ...
随机推荐
- 模仿JQuery 的添加多个事件的原理
var jquery=function(dom){ var obj={ ready:function(fn){ if(typeof dom.onload=="function"){ ...
- 探秘GO语言《比较C#与GO的性能》
这段时间也来学学GO语言,听说它的性能相当的棒棒,我就拿C#来和它做比对一下. 这里只是单纯了做了for循环的比对,看看谁的循环快 C# 代码: static void Main(string[] a ...
- JTAG接线描述
http://www.dzsc.com/data/html/2008-12-23/75397.html JTAG测试信号由下面5个信号组成. TRST:测试复位输入信号,测试接口初始化 TCK:测试时 ...
- TLC2262和TLC2264 轨对轨运算放大器
TLC2262和TLC2264分别是TI公司双路和四路运算放大器,两种器件可以在单电源或双电源条件下供电,从而增强了动态的范围,可以达到轨对轨输出的性能.TLC226X系列与TLC225X的微功耗和T ...
- PyQt5 各种菜单实现
# -*- coding: utf-8 -*- # Created by PCITZDF on 2018/4/8 15:36. # FileName: menuandtools.py import s ...
- MySql 数据库导入"Unknown command '\n'."错误解决办法
原文地址:http://www.cnblogs.com/bingxueme/archive/2012/05/15/2501999.html 在CMD 下 输入: Mysql -u root -p -- ...
- #pragma mark 添加分割线 及 其它类似标记 - 转
#pragma marks Comments containing: MARK: TODO: FIXME: !!!: ???: 除了使用 #pragma mark -添加分割线之外, 以上几种标记均可 ...
- 关于deselectRowAtIndexPath
有没有遇到过,导航+UITableView,在push,back回来之后,当前cell仍然是选中的状态.当然,解决办法简单,添加一句[tableView deselectRowAtIndexPath: ...
- C#编程(二)
C#中的变量 例如:int i;//声明一个int类型的变量,变量名是 i;在未为该变量进行赋值操作前,禁止使用该变量.使用(=)给变量赋值,在声明之后可以 i=10来赋值.也可以在声明一个变量的同时 ...
- Selenium2+python自动化53-unittest批量执行(discover)
前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了. 加载用例后,用unittest里面的Text ...