/*包装类*/ /*  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、抽象类的更多相关文章

  1. JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类

    常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...

  2. 2022-7-23 pan小堂 Object与Final

    Object类 1.Object方法 public final native Class<?> getClass() 返回object运行时类 public native int hash ...

  3. Java接口和抽象类详解

    父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ...

  4. Spring源码分析——BeanFactory体系之抽象类、类分析(二)

    上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之 ...

  5. 由Spring框架中的单例模式想到的

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 注:Spring源码的版本4.3.4 Spring依赖注入Bean实例默认 ...

  6. Java探索之旅(15)——包装类和字符类

    1.包装类 ❶出于对性能的考虑,并不把基本数据类型作为对象使用,因为适用对象需要额外的系统花销.但是某些Java方法,需要对象作为参数,例如数组线性表ArrayList.add(Object).Jav ...

  7. Java - 包装类 常量池

    概述: 在Java中存在一些基本数据类型,这些基本数据类型变量,不能像其他对象一样调用方法,属性.... 一些情况下带来一些问题,包装类就是为了解决这个问题而出现 包装类可以使得这些基础数据类型,拥有 ...

  8. 菜鸡的Java笔记 第二十五 wrapperClass 包装类

    wrapperClass 包装类         1.包装类的特点        2.装箱与拆箱操作        3.数据转型处理            内容        Object 类可以接收 ...

  9. Java接口和抽象类的区别

    今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...

  10. 3、Object对象的两大方法(hashCode-equals)总结

    Object类是所有java类的父类. 用户定义了如下一个Person类 public class Person{} 在类定义中并没有明确继承Object类,但是编译器会自动的完成这个过程. 既然所有 ...

随机推荐

  1. 模仿JQuery 的添加多个事件的原理

    var jquery=function(dom){ var obj={ ready:function(fn){ if(typeof dom.onload=="function"){ ...

  2. 探秘GO语言《比较C#与GO的性能》

    这段时间也来学学GO语言,听说它的性能相当的棒棒,我就拿C#来和它做比对一下. 这里只是单纯了做了for循环的比对,看看谁的循环快 C# 代码: static void Main(string[] a ...

  3. JTAG接线描述

    http://www.dzsc.com/data/html/2008-12-23/75397.html JTAG测试信号由下面5个信号组成. TRST:测试复位输入信号,测试接口初始化 TCK:测试时 ...

  4. TLC2262和TLC2264 轨对轨运算放大器

    TLC2262和TLC2264分别是TI公司双路和四路运算放大器,两种器件可以在单电源或双电源条件下供电,从而增强了动态的范围,可以达到轨对轨输出的性能.TLC226X系列与TLC225X的微功耗和T ...

  5. PyQt5 各种菜单实现

    # -*- coding: utf-8 -*- # Created by PCITZDF on 2018/4/8 15:36. # FileName: menuandtools.py import s ...

  6. MySql 数据库导入"Unknown command '\n'."错误解决办法

    原文地址:http://www.cnblogs.com/bingxueme/archive/2012/05/15/2501999.html 在CMD 下 输入: Mysql -u root -p -- ...

  7. #pragma mark 添加分割线 及 其它类似标记 - 转

    #pragma marks Comments containing: MARK: TODO: FIXME: !!!: ???: 除了使用 #pragma mark -添加分割线之外, 以上几种标记均可 ...

  8. 关于deselectRowAtIndexPath

    有没有遇到过,导航+UITableView,在push,back回来之后,当前cell仍然是选中的状态.当然,解决办法简单,添加一句[tableView deselectRowAtIndexPath: ...

  9. C#编程(二)

    C#中的变量 例如:int i;//声明一个int类型的变量,变量名是 i;在未为该变量进行赋值操作前,禁止使用该变量.使用(=)给变量赋值,在声明之后可以 i=10来赋值.也可以在声明一个变量的同时 ...

  10. Selenium2+python自动化53-unittest批量执行(discover)

    前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了. 加载用例后,用unittest里面的Text ...