面向对象(二)

包装类

Java是面向对象的编程语言,有8中基本的数据类型,但是这8中数据类型不具备面向对象的编程机制,基本数据类型对象也不具备“对象”特性:没有成员变量、方法可以被调用。

所有引用类型的变量都是继承了Object类,都可当成Object类型变量使用,但是基本的数据类型不行。所以Java提供了包装类,为这8种基本数据类型提供相应的引用类型,并称之为基本数据类型的包装类。int包装类是Integer,char包装类是Character,其他的就是基本数据类型首字母大写。

除了Character之外,可以通过传入一个字符串参数来构建包装类对象。

自动装箱:把一个基本类型变量直接赋给对应的包装类变量,或者赋给Object变量(Object是所有类的父类,子类对象可以直接赋给父类变量);

自动拆箱:与自动装箱相反,允许直接把包装类对象直接赋给一个对应的基本类型变量。

public class BoxTest{
    public static void main(String[] args){
        //自动装箱,把基本数据类型赋给包装类对象
        Integer i = 5;
        System.out.println(i);
        }
    }

进行自动装箱和自动拆箱时必须注意类型匹配。注:即使赋给Object类型变量,也是利用Java向上自动转型特性,不要多想。

包装类还可以实现基本类型变量和字符串之间的转换。

把字符串类型转换为基本数据类型的值有两种方法:

1、利用包装类提供parseXxx(String s)静态方法(除了Character以外的所有包装类都提供了该方法)

public class ParseTest{
    public static void main(String[] args){
        String istr = "123";
        //使用包装类提供的parsexXX()方法把字符串转换为基本数据类型
        int in = Integer.parseInt(istr);
        System.out.println(in);
        //Character没有提供parseXxx()方法,所以下面程序出错
        //char c = Character.parseChar(istr);
        }
    }

2、利用包装类提供的Xxx(String s)构造器,传入一个字符串参数来构建包装类对象

public class ParseTest{
    public static void main(String[] args){
        String istr = "123";
        Integer in = new Integer(istr);
        System.out.println(in);
        }
    }

String提供了多个重载valurOf()方法,用于将基本类型变量转换成字符串

public class ValueOfTest{
    public static void main(String[] args){
        int a = 123;
        String s = String.valueOf(a);
        System.out.println(s);
        }
    }

还有一种更简单的方法,把基本类型变量和""进行连接运算,系统会自动把基本数据类型转换为字符串

 int a = 123;
 //基本数据类型和双引号""连接运算
 String s = a + " ";

包装类型的变量是引用类型,但包装类实例可以与数值类型的值进行比较,这种比较是直接取出包装类实例所包装的数值进行比较

Integer i = new Integer(6);
//包装类实例直接与基本数据类型比较
System.out.println(a > 5);

两个包装类实例比较的情况比较复杂,包装类的实例实际上是引用类型,只有两者指向同一对象才会返回true,即两者指向同一内存返回true。

//返回false
System.out.println(new Integer(2) == new Integer(2));

自动装箱就是可以把一个基本类型值赋给一个包装类实例

对象的处理

Java对象都是Object类的实例,都可以直接调用该类中定义的方法,这些方法是处理Java对象的通用方法。

class Person{
    private String name;
    public Person(String name){
        this.name = name;
        }
    }
public class PersonTest{
    public static void main(String[] args){
        Person p = new Person("影流之主");
        System.out.println(p);
        }
    }

上面程序输出

[email protected]

如果改为

System.out.println(p.toString());

结果还是一样。toString()是一个非常特殊的方法,它是一个“自我描述”方法,该方法功能:当程序员需要打印该对象时,系统将会输出该对象的“自我描述”信息,用以告诉外界该对象具有的状态信息。

Object类提供的toString()方法总是返回该对象实现类的“类名 + @ + hashCode”值,这并不能真正实现自我描述功能,所以用户需要自动以类能显示“自我描述”的功能。

class Person{
    private String name;
    public Person(String name){
        this.name = name;
        }
    //重写toString()方法
    public String toString(){
        return name;
        }
    }
public class PersonTest{
    public static void main(String[] args){
        Person p = new Person("影流之主");
        System.out.println(p);
        }
    }

== 和 equals()方法

Java测量两个变量是否相等有两种方法:一种是 == 运算符,一种是equals()方法。

当使用==判断的时候,如果两个是基本数据类型变量,且都是数值类型,只要两个变量的值相等,返回true。

但引用类型变量只有指向统一对象才会返回true。

public class EqualsTest1{
    public static void main(String[] args){
        String str1 = new String("hello");
        String str2 = new String("hello");
        //使用==判断引用类型是否相等,返回false
        System.out.println(str1 == str2);
        }
    }

常量池:专门用于管理在编译时被确定并被保存在已编译.class文件中的一些数据。它包括关于类、方法、接口中的常量,还包括字符串常量。

public class ChangLiangChiTest{
    public static void main(String[] args){
        //s1直接引用常量池中的 疯狂Java讲义
        String s1 = "疯狂Java讲义";
        String s2 = "疯狂";
        String s3 = "Java讲义";
        //s4的字符串在编译时就确定下来,直接引用常量池中的
        String s4 = "疯狂" + "Java讲义";
        //s5字符串不能在编译时就确定下来,不能引用常量池中的
        String s5 = s2 + s3;
        //使用new创建一个新的String对象,s6引用堆内存中的String对象
        String s6 = new String("疯狂Java讲义");
        }
    }

JVM常量池可以保证相同的字符串直接量只有一个,不会产生副本,s1和s2使用同一字符串对象。

new String()创建的字符串对象运行时创建出来,被保存在运行时堆内存,不会放到常量池。

对于两个字符串变量,只是要求它们引用字符串对象的字符序列相同即可认为相等。此时利用String对象的equals()方法进行判断就可以。

equals()方法是Object类提供的一个实例方法,所有引用变量都可以调用该方法判断是否与其他引用变量相等。但使用这个方法判断两个对象是否相等与使用==运算符没有区别,同样要求两个引用变量指向同一对象返回true。这样的话就没有太大的意义了,如果希望自动了相等标准,可以重写equals方法。

String已经重写的equals方法,String的equals方法判断两个字符串相等的标准是:只要两个字符串所包含的字符序列相同,equals返回true。

class Person{
    //省略……
    //重写equals()方法,提供自定义相等标准
    public boolean equals(Object obj){
        //如果两个对象为同一对象
        if(this == obj){
            return true;
            }
        //只有当obj是Person对象
        if(obj != null && obj.getClass() == person.class){
            Person personObj = (Person)obj;
            //并且当前对象的idStr和obj的idStr相等,才可判断两个对象相等
            if(this.getIdStr().equals(PersonObj.getIdStr())){
                return true;
                }
            }
            return false;
        }
    }

 类成员

static修饰的成员是类成员,属于整个类。

Java类里只能包含变量、方法、构造器、初始化块、内部类(包括接口、枚举)

类变量属于整个类,系统第一次准备使用该类时,就会为该类变量分配内存。知道该类被卸载,变量所占内存才会被系统回收机制回收。

当通过对象来访问类变量时,系统会在底层转换为通过该类来访问类变量。

当使用实例来访问类成员时,实际上是委托该类来访问类成员,因此即使某个实例为null,它也可以访问它所属的类成员。

时间: 2024-08-04 18:11:21

面向对象(二)的相关文章

php面向对象(二) $this

<!doctype html> <html> <head> <meta charset="UTF-8"> <title>this</title> </head> <body> <?php //对象一旦被创建 对象中的每个成员方法里面都会存在一个特殊的对象引用"$this" 成员方法属于哪个对象 $this引用就代表哪个对象 专门用来完成对象内部成员之间的访问 cla

PHP面向对象(二)

一.概念 封装性是面向对象编程中的三大特性之一,封装就是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节,以达到对成员的访问控制(切记不是拒绝访问). 含义: a.把对象的全部成员属性和全部成员方法结合在一起,形成一个不可分割的独立单位(即对象) b.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系. 原则:要求对象以外的部分不能随意存取对象的内部数据(成员属性和成员方法),从而有效的避免了外部错  误对

python面向对象二

1.1类的静态属性,类方法,类的静态方法 1.1.1静态属性(@property) 在类中: python内置的@property装饰器就是负责把一个方法(函数)变成属性来调用. class Student: def __init__(self,name,age,score): self.name = name self.age = age self.score = score @property def get_score(self): return self.score def learn(

python面向对象(二)

类的成员 类的成员可以分为三大类:字段.方法和属性 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class foo: # 字段(静态字段,保存在类里) cc = '111' def __init__(self): # 字段(普通的字段,保存在对象里) self.name = 'mxz' def f1(self): print(self.name) class Province: # 静态字段 cou

Python自动化开发 - 面向对象(二)

本节内容 1.isinstance(obj,cls)和issubclass(sub,super) 2.反射 3.__setattr__,__delattr__,__getattr__ 一. isinstance(obj,cls)和issubclass(sub,super) 1.isinstance(obj,cls) 检查obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstance(obj, Foo)) # True 2.

学java教程之面向对象(二)

学编程吧java学习之面向对象(二)发布了,请通过xuebiancheng8.com来访问 前面已经分析了面向对象中的类和对象,属性,方法这些概念了.下面来学习如何定义一个类.比方说现在有一个学生类,有年龄,姓名等属性,有学习,吃饭的方法. 代码如下: public class Person{ String name; int age; public void study(){ System.out.println("正在学习"); } public void eat(){ Syste

JavaScript面向对象(二)——成员属性、静态属性、原型属性与JS原型链

前  言 上一篇博客(https://www.cnblogs.com/qdjianghao/p/10177360.html )中,我们介绍了JS中的面向对象,并详细的解释了this的指向问题.本篇博客,我们继续来学习JS的面向对象.来深入理解一下JavaScript OOP中的成员属性/方法.静态属性/方法.原型属性/方法,并且一起来探讨一下JS中的原型与原型链. 一 成员属性与成员方法 在构造函数中,通过this.属性声明.或者实例化出对象后,通过"对象.属性"追加的.都属于成员属性

javascript面向对象(二)

我们已经描述了对象的创建,那么接下来主要讲解对象的结构和对象的属性. 首先我们先看下对象和类的结构图 Person类 person的一个实例 那么在上面,我们称变量 p 是 Person类的一个实例(大家在学习或者其他的视频教学时经常听到 创建一个实例对象就是这么来的). 在p和Person之间,通过在创建new Person的时候为对象p添加了两个主要的属性. constructor:构造器 用来指向当前对象创建时,所调用的函数. __proto__:原型指针属性.通常用来指向当前构造函数的p

面向对象二 — — 继承、抽象类、接口

一.继承 extends 继承的特点:Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类 1.参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载. 2.返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载. 3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private) 4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常. 用supe

面向对象二 — — static、final、常量的初始化、this和super

一.static关键字 static :静态的--属于类的 动态的是属于对象的 注意: 属于对象的,那么每个对象都独有一份:属于类的,是所有的对象共有一份 static修饰方法: 凡是加了static的,都是属于类的,凡是属于类的,都是被所有的对象共享 访问方式: 对象.方法名(参数列表) 类名.方法名(参数列表)--推荐使用 总结: 1.静态的方法里面不能访问非静态的方法和属性 2.非静态的方法里面可以访问非静态的方法和属性以及静态的方法和属性 3.静态的方法只能访问静态的方法和属性 4.静态