Java_51_组合_内部类详解_字符串(String类)_equals和==的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pmcasp/article/details/82756525

组合

使用组合,可以获得更多的灵活性,你甚至可以在运行的时候才决定哪几个类组合在一起。

使用继承,他是一种高度耦合,派生类和基类被紧紧的绑在一起,灵活性大大降低,而且,滥用继承,也会使继承树变得又大又复杂,很难理解和维护。

如果是is-a关系,用继承。【是一个[对象]】

如果是has-a关系,用组合。【拥有一个[成员变量]】

可以这么理解:假设a,b都是一种类型,a is-a b,说明a类对象是b类对象,只不过是特殊的一种。比如说”飞机“是一种“交通工具”。对应到c++中就是继承关系。
a has-a b,说明a类对象具有若干b类对象作为其成员。比如“飞机”有”翅膀“。
私有继承实现has-a关系,一是从对象关系上来说是不合理的,写程序的人知道,但是看程序的人就会误会了。二是,用私有继承,比如a中私有继承了b,那么b的所有成员和函数在a中都是private,不能直接访问的了,会对后面的使用造成不方便。[摘自百度知道]

内部类的作用

1.内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。

2.内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性。

内部类的使用场合

由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,通常内部类在只为所在外部类提供服务的情况下优先使用。

内部类的分类

1.成员内部类(可以使用private、proteted、public任意进行修饰。类文件:外部类$内部类.class)

2.非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)

3.非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。

4.非静态内部类可以使用外部类的成员,但是外部类不能直接访问非静态内部类成员。

5.非静态内部类不能有静态方法、静态属性、静态初始化块。

6.静态成员不能访问非静态成员:外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。

7.成员变量访问要点

   7.1 内部类里方法的局部变量:变量名 //varName(变量名或方法名)

   7.2 内部类属性:this.变量名 //this.varName(内部类方法或属性)

   7.3 外部类属性:外部类名.this.变量名 //className.this.varName(方法或属性)

8.内部类的访问:

   8.1 外部类中定义内部类:new lnnerClass()

   8.2 外部类以外的地方使用非静态内部类:Outer,inner varname = OuterObject.new lnner()

   Face.Nose nose=new Face().new Nose();//(声明方法一)普通内部类

   Face f2=new Face();//(声明方法二)普通内部类

   Face.Nose nose2=f2.new Nose();//(声明方法二)普通内部类

9.静态内部类

   9.1 定义方式:static class className{//类体}

   9.2 使用要点:

          9.2.1 当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。

           9.2.2 静态内部类看作外部类的一个静态成员。因此,外部类的方法中可以通过:静态内部类.名字 访问静态内部类的静态成员。通过new静态内部类()访问静态内部类的实例。

           9.2.3 在外部类的外面创建静态内部类:

Face.TestStaticlnner alnner=new Face.TestStaticlnner();//静态内部类

10.匿名内部类

适合那种只需要使用一次的类。比如:键盘监听操作等等。语法:new 父类构造器(实参列表)实现接口(){ //匿名内部类类体 }

11.局部内部类(方法内部类)

定义在方法内部。作用域只限于本方法。用的非常少。

字符串(Java.lang.String类)的使用

Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的。

Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例。

String e="";

String greeting="Hello World";

Java允许使用符号“+”把两个字符串连接起来

String s1="Hello";

String s2="World!";

String s=s1+s2;//HelloWorld!

 符号“+”把两个字符串按固定的顺序连接在一起,并且是完全按照固定的形式。

当“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后在进行连接。

int age=11;

String s="age is”+age;//s 赋值为age is 18

这种特性通常被用在输出语句中:

System.out.println("age is”+age);

开始学习阅读API文档:

字符串类常用的方法:

char cahrAt(int index) 返回字符串中第index个字符。

boolean equals(String other) 如果字符串与other相等,返回true。

boolean equalslgnoreCase(String other) 如果字符串与other相等(忽略大小写)则返回true。

int indexOf(String str) lastIndexOf()

int indexOf(String str,int fromIndex)

返回与str匹配的第一个字串的开始位置,该位置从0或fromIndex开始计算,如果元氏串中不存在str,返回-1。

int length() 返回字符串的长度。

String reqlace(char oldChar,char newChar) 返回一个新串,它是通过用newChar替换此字符串中出现的所有oldChar而生成的。

boolean startsWith(String prefix) 如果字符串以prefix开始,则返回true。

boolean endsWith(String prefix) 如果字符串一prefix结尾,则返回true。

String substring(int beginIndex) 返回一个新字符串,该串包含从原始字符串beginIndex到串尾或endIndex-1的所有字符。

String toLowerCase() 返回一个新字符串,该串将原始字符串中的所有大写字母改成小字母。

String toUpperCase() 返回一个新字符串,该串将原始字符串中的所有小字母改成大写字母。

String trim() 返回一个新字符串,该串删除了原始字符串头部和尾部的空格。

equals 方法用来检测两个字符串内容是否相等。如果字符串s和t内容相等,则s.equals(t)返回true,否则返回false。s和t即可以是字符串变量,也可以是字符串常数,例如:“Hello”.equals(t);

"Hello".equalsIgnoreCase("hellO");//true

判断字符串是否相等不要使用“==”

equals和==的区别

1.“==”比较的是引用地址是否相等【基础类型比较和引用类型比较】。

2.“equals”默认比较的是引用地址,如果equals实现后是比较的是内容是否相等(字符串等等)。

3.如果是String类的对象,使用equals比较的话就是比较字符内容是否相等,因为String类源码已经实现了equals字符比较的方法。

equals源码:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

--------------------------------------------------------------

public class Test {
    public static void main(String[] args) {
        String a1="qwer";
        String a2="qwer";
        Test a3=new Test();
        Test a4=new Test();
        String a5=new String("qwer");
        String a6=new String("qwer");
        System.out.println("变量a1          equals          变量a2 ="+a1.equals(a2));
        System.out.println("变量a1            ==             变量a2 ="+(a1==a2));
        
        System.out.println("Test对象a3    equals    Test对象a4 ="+a3.equals(a4));
        System.out.println("Test对象a3      ==       Test对象a4 ="+(a3==a4));
        
        System.out.println("String对象a5 equals String对象a6 ="+a5.equals(a6));
        System.out.println("String对象a5   ==    String对象a6 ="+(a5==a6));
    }
}

ps:重点!重点!重点! Test实例对象equals实际使用的“==”,String实例对象因为equals已经实现了String 字符串的对比方法,所以比较的是String对象的内容。

猜你喜欢

转载自blog.csdn.net/pmcasp/article/details/82756525