zoukankan      html  css  js  c++  java
  • java 面向对象三

    1.基本数据类型的包装类

    Java提倡的万物皆对象,但是数据类型的划分出现了基本数据类型和引用数据类型,那么我们怎么能把基本数据类型称为对象呢?

    • 除了Integer和Character定义的名称和对应的基本类型差异大,其他六种都是将首字母大写就可以了。
    • Integer,Byte,Float,Double,Short,Long都是Number类的子类。;
    • Character和Boolean都是Object直接子类;
    • 8个类都是final修饰的(不可被继承)。
    • 涉及到享元模式:在操作整数的时候,系统缓存一个-128~127 范围的数

    2.自动装箱&自动拆箱

    • 自动装箱:可把一个基本类型变量直接赋给对应的包装类对象或则Object对象
    • 自动拆箱:允许把 包装类对象直接赋给对应的基本数据类型

    3.基本类型和String之间的转换

    • String → 基本类型,除了Character外所有的包装类提供parseXxx(String s)静态方法,用于把一个特定的字符串转换成基本类型变量;
    • 基本类型 → String,String 类有静态方法valueOf(),用于将基本类型的变量转换成String类型。
    String str = "17";
    int i = Integer.parseInt(str);//String  --> 基本类型
    String s1 = String.valueOf(i);//基本类型 --> String
    

    4.Object类

    • 所有类的公共父类,一旦一个类没有显示地继承一个类则其直接父类一定是Object。

    • 一切数据类型都可用Object接收

    • class OOXX extends Object{}等价于class ooXX {}

    • 常见方法
      public boolean equals(Object obj):对象比较
      public int hashCode():取得该对象的Hash码
      public String toString():对象描述

    • Object类的 toString()方法:“对象的描述”
      建议所有类都覆写此方法
      直接打印输出对象时,会调用该对象的toString()方法。

    • 打印对象的时候,实际调用的对象实际指向的类的自我描述;
      全限定类名+@+十六进制的hashCode值,等价于
      全限定类名+@+IntegertoHexString(该对象.hashCode) ;

    • equals也是判断是否指向同一个对象
      没有实际意义,有必要可以重写
      public boolean equals(Object obj) {}

    • String 覆写了 Object的equals方法:只比较字符的序列是否相同

    • ==用于判断两个变量是否相等
      基本类型:
      引用类型:必须指向同一个对象,才true
      只能比较有父子或平级关系的两个对象

    5.代码块

    • 代码块指的是使用"{}"括起来的一段代码,根据代码块存在的位置可以分为4种:
      普通代码块;
      构造代码块;
      优先于构造方法执行,每次实例化对象之前都会执行构造代码块。
    {
    	 System.out.println("我是构造代码块");
        }
        public Demo(){
    	System.out.println("我是构造方法");
        }
        public static void main(String[] args) {
    	 Demo d1  = new Demo();
    	 Demo d2  = new Demo();
        }
    
    
        静态代码块;
              优先于主方法执行,优先于构造代码块执行,不管有创建多少对象,静态代码块只执行一次,可用于给静态变量赋值;
    
      {
    	System.out.println("我是构造代码块");
        }
        public Demo(){
    	System.out.println("我是构造方法");
        }
        static {
    	System.out.println("我是静态代码块");
        }
        public static void main(String[] args) {
    	System.out.println("Main");
    	new Demo();
    	new Demo();
       }
    
        同步代码块。
    
    • 代码块里变量的作用域:
      只在自己所在区域(前后的{})内有效;

    6.Singleton模式(单态模式)

    目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例

    • 饿汉式

    private static Singleton1 s = new Singleton1();

    public static Singleton1 getInstance(){
    	return s;
    }
    
    private Singleton1(){
    	
    }
    ```
    
    • 懒汉式
    	private static Singleton2 s2 = null;
    	
    	public static Singleton2 getInstance(){
    		if(s2 == null){
    			s2 = new Singleton2();
    			return s2;
    		}
    		return s2;
    	}
    	
    	private Singleton2(){}
    
    • 双重检查锁定
    private static Singleton3 s3= null;
    	
    	public static Singleton3 getInstance(){
    		
    		if(s3 == null){
    			
    			synchronized(Singleton3.class){
    				if(s3 == null){
    					s3 = new Singleton3();
    				}
    			}
    			
    		}
    		return s3;
    	}
    	
    	private Singleton3(){}
    

    7.final关键字

    1. 用final修饰的类不能被继承
    2. 用final修饰的方法不能被子类重写,但可以本类重载
    3. 用final修饰的变量或常量只能被赋值一次。不能更改值。通常用作全局常量。
      如:常量名称所有字母大写,若有多个单词组成,单词间使用下划线连接。
      public static final double PI = 3.14159265358979323846;
      public static final String APP_SEPARATOR = "/";

    8.抽象类

    • 当编写一个类时,我们往往会为该类定义一些方法,这些方法时用来描述该类的行为方式,那么这些方法都有具体的方法体。
    • 但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。
      比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
    • abstract 关键字
    1. 通过abstract关键字来修饰的类称为抽象类;
    2. 可以定义被abstract修饰的抽象方法
    3. 抽象方法只有返回类型和方法签名,没有方法体。
    4. 抽象类可以含有普通方法
    5. 抽象类不能创建实例对象(不能new)
    6. 需要子类覆盖掉所有的抽象方法后才可以创建子类对象,否则子类也必须作为抽象类

    例子:求不同图形的周长

    • 抽象类 图形:
    	public abstract double getZc();
    	public void printName(){
    		System.out.println("printName");
    	}
    
    • 三角形:
            private double a;
    	private double b;
    	private double c;
    	@Override
    	public double getZc() {
    		return this.a + this.b + this.c;
    	}
    	public SanJiaoXing(double a,double b,double c) {
    		this.a = a;
    		this.b = b;
    		this.c = c;
    	}
    
    • 四边形
            private double a;
    	private double b;
    	private double c;
    	private double d;
    	
    	@Override
    	public double getZc() {
    		// TODO Auto-generated method stub
    		return this.a + this.b + this.c + this.d;
    	}
    
    	public SiBianXing(double a, double b, double c, double d) {
    		super();
    		this.a = a;
    		this.b = b;
    		this.c = c;
    		this.d = d;
    	}
    
    	public SiBianXing() {
    		super();
    	}	
    
    • 测试:
            public static void main(String[] args) {
            TuXing san = new SanJiaoXing(2, 3, 5);
    	System.out.println(san.getZc());
    	TuXing si = new SiBianXing(6, 5, 2, 1);
    	System.out.println(si.getZc());
    	}
    
  • 相关阅读:
    Linux chattr 文件保护
    ArcGIS案例学习笔记-批处理擦除挖空挖除相减
    ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减
    GIS案例学习笔记-CAD数据分层导入现有模板实例教程
    GIS案例学习笔记-ArcGIS整图大图出图实例教程
    Arcgis map export or print Error: Cannot map metafile into memory. Not enough memory
    [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]
    GIS案例学习笔记-明暗等高线提取地理模型构建
    地理处理模型、案例、教程、培训低价发送
    GIS工具-shp浏览器
  • 原文地址:https://www.cnblogs.com/linbin7/p/14525531.html
Copyright © 2011-2022 走看看