フェイスオブジェクトファンデーション、array_Day02


==equals()

== 基本数值相等值相等、引用类型地址(即内存地址)相等  ,为true

equals()比较的是两个对象的值(即内存地址里存放的值)是否相等 , 为true

public class TestEquals {
    
     
    public static void main(String[] args) {
    
    
        Person p1 = new Person(123,"高淇");
        Person p2 = new Person(123,"高小七");     
        System.out.println(p1==p2);     //false,不是同一个对象
        System.out.println(p1.equals(p2));  //true,id相同则认为两个对象内容相同
        String s1 = new String("尚学堂");
        String s2 = new String("尚学堂");
        System.out.println(s1==s2);         //false, 两个字符串不是同一个对象
        System.out.println(s1.equals(s2));  //true,  两个字符串内容相同
    }
}
class Person {
    
    
    int id;
    String name;
    public Person(int id,String name) {
    
    
        this.id=id;
        this.name=name;
    }
    public boolean equals(Object obj) {
    
    
        if(obj == null){
    
    
            return false;
        }else {
    
    
            if(obj instanceof Person) {
    
    
                Person c = (Person)obj;
                if(c.id==this.id) {
    
    
                    return true;
                }
            }
        }
        return false;
    }
}

super() 默认

调用父类对象的成员变量,向上追溯

    
public class TestSuper02 {
    
     
    public static void main(String[] args) {
    
    
        System.out.println("开始创建一个ChildClass对象......");
        new ChildClass();
    }
}
class FatherClass {
    
    
    public FatherClass() {
    
    
        System.out.println("创建FatherClass");
    }
}
class ChildClass extends FatherClass {
    
    
    public ChildClass() {
    
    
        System.out.println("创建ChildClass");
    }
}
封装

	  1. private 表示私有,只有自己类能访问

      2. default 表示没有修饰符修饰,只有同一个包的类能访问

      3. protected 表示可以被同一个包的类以及其他包中的子类访问

      4. public 表示可以被该项目的所有包中的所有类访问
    
类的属性的处理:(养成好习惯)

      1. 一般使用 private 访问权限。

      2.  提供相应的 get / set 方法来访问相关属性,这些方法通常是 public 修饰的,以提供对属性的赋值与读取操作(注意: boolean 变量的 get 方法是 is 开头!)3. 一些只用于本类的辅助性方法可以用 private 修饰,希望其他类调用的方法用 public 修饰。

多态的要点:

   1. 多态是方法的多态,不是属性的多态(多态与属性无关)2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。

   3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。
     
     
     
     
class Animal {
    
    
    public void shout() {
    
    
        System.out.println("叫了一声!");
    }
}
class Dog extends Animal {
    
    
    public void shout() {
    
    
        System.out.println("旺旺旺!");
    }
    public void seeDoor() {
    
    
        System.out.println("看门中....");
    }
}
class Cat extends Animal {
    
    
    public void shout() {
    
    
        System.out.println("喵喵喵喵!");
    }
}
public class TestPolym {
    
    
    public static void main(String[] args) {
    
    
        Animal a1 = new Cat(); // 向上可以自动转型
        //传的具体是哪一个类就调用哪一个类的方法。大大提高了程序的可扩展性。
        animalCry(a1);
        Animal a2 = new Dog();
        animalCry(a2);//a2为编译类型,Dog对象才是运行时类型。
         
        //编写程序时,如果想调用运行时类型的方法,只能进行强制类型转换。
        // 否则通不过编译器的检查。
        Dog dog = (Dog)a2;//向下需要强制类型转换
        dog.seeDoor();
    }
 
    // 有了多态,只需要让增加的这个类继承Animal类就可以了。
    static void animalCry(Animal a) {
    
    
        a.shout();
    }
 
    /* 如果没有多态,我们这里需要写很多重载的方法。
     * 每增加一种动物,就需要重载一种动物的喊叫方法。非常麻烦。
    static void animalCry(Dog d) {
        d.shout();
    }
    static void animalCry(Cat c) {
        c.shout();
    }*/
}
final 关键字的作用:

	1. 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。
	
	   final  int   MAX_SPEED = 120;
	   
	2. 修饰方法:该方法不可被子类重写。但是可以被重载!
	
	   final  void  study(){
    
    }
	   
	3. 修饰类: 修饰的类不能被继承。比如:Math、String等。
	
		final   class  A {
    
    }
数组的定义

	数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。
    
	数组的三个基本特点:

      1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

      2. 其元素必须是相同类型,不允许出现混合类型。

      3. 数组类型可以是任何数据类型,包括基本类型和引用类型。
    
     数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是
    
对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中存储的。
    
    
	type[]   arr_name; //(推荐使用这种方式)

	type    arr_name[];

    
   	  1. 声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。

      2. 声明一个数组的时候并没有数组真正被创建。

      3. 构造一个数组,必须指定长度。
          
          
  数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。
foreach循环:只可读
	
public class Test {
    
    
    public static void main(String[] args) {
    
    
        String[] ss = {
    
     "aa", "bbb", "ccc", "ddd" };
        for (String temp : ss) {
    
    
            System.out.println(temp);
        }
    }
}
抽象类的使用要点:

     1. 有抽象方法的类只能定义成抽象类

     2. 抽象类不能实例化,即不能用new来实例化抽象类。

     3. 抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用。

     4. 抽象类只能用来被继承。

     5. 抽象方法必须被子类实现。
         
     //抽象类
abstract class Animal {
    
    
    abstract public void shout();  //抽象方法
}
class Dog extends Animal {
    
     
    //子类必须实现父类的抽象方法,否则编译错误
    public void shout() {
    
    
        System.out.println("汪汪汪!");
    }
    public void seeDoor(){
    
    
        System.out.println("看门中....");
    }
}
//测试抽象类
public class TestAbstractClass {
    
    
    public static void main(String[] args) {
    
    
        Dog a = new Dog();
        a.shout();
        a.seeDoor();
    }
}
接口:规范和具体实现的分离 。 比抽象更加抽象
    
      从接口的实现者角度看,接口定义了可以向外部提供的服务。

      从接口的调用者角度看,接口定义了实现者能提供那些服务。
    
      1. 普通类:具体实现

      2. 抽象类:具体实现,规范(抽象方法)

      3. 接口:规范!
    
[访问修饰符]  interface 接口名   [extends  父接口1,父接口2]  {
    
    
	常量定义;  
	方法定义;
}

定义接口的详细说明:

      1. 访问修饰符:只能是 public 或默认。

      2. 接口名:和类名采用相同命名机制。

      3.  extends :接口可以多继承。

      4. 常量:接口中的属性只能是常量,总是: public static final 修饰。不写也是。

      5. 方法:接口中的方法只能是: public abstract 。 省略的话,也是 public abstract 。

要点

      1. 子类通过 implements 来实现接口中的规范。

      2. 接口不能创建实例,但是可用于声明引用变量类型。

      3. 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是 public 的。

      4.  JDK1.7 之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。

      5.  JDK1.8 后,接口中包含普通的静态方法。
	内部类只是一个编译时概念,一旦我们编译成功,就会成为完全不同的两个类。对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后会出现Outer.classOuter$Inner.class两个类的字节码文件。所以内部类是相对独立的一种存在,其成员
变量/方法名可以和外部类的相同。
        
        
/**外部类Outer*/
class Outer {
    
    
    private int age = 10;
    public void show(){
    
    
        System.out.println(age);//10
    }
    /**内部类Inner*/
    public class Inner {
    
    
        //内部类中可以声明与外部类同名的属性与方法
        private int age = 20;
        public void show(){
    
    
            System.out.println(age);//20
        }
    }
}



内部类的作用:

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

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

      3. 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整。
内部类:成员内部类(静态、非静态)、匿名内部类、局部内部类(甚少用到)
    a)非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)

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

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

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

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

      v. 成员变量访问要点:

        1. 内部类里方法的局部变量:变量名。

        2. 内部类属性:this.变量名。

        3. 外部类属性:外部类名.this.变量名。b) 静态内部类
    
    b) 静态内部类

      i. 定义方式:
    static  class   ClassName {
    
    
	//类体
	}

      ii. 使用要点:

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

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

	 匿名内部类

      适合那种只需要使用一次的类。比如:键盘监听操作等等。
    new  父类构造器(实参类表) \实现接口 () {
    
    
           //匿名内部类类体!
	}
 	  1. 匿名内部类没有访问修饰符。

      2. 匿名内部类没有构造方法。因为它连名字都没有那又何来构造方法呢。
          
          
.局部内部类

      还有一种内部类,它是定义在方法内部的,作用域只限于本方法,称为局部内部类。

      局部内部类的的使用主要是用来解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法中被使用,出了该方法就会失效。

      局部内部类在实际开发中应用很少。
比较字符串用 equals
SN(シリアル番号) メソッドの説明 説明
1 char charAt(int index) 指定されたインデックスのchar値を返します。
2 int compareTo(Object o) この文字列を別のオブジェクトと比較します。
3 int compareTo(String anotherString) 2つの文字列を字句的に比較します。
int compareToIgnoreCase(String str) 大文字と小文字を区別せずに、2つの文字列を字句的に比較します。
5 文字列concat(文字列str) 指定した文字列をこの文字列の末尾に接続します。
6 ブール値contentEquals(StringBuffer sb) 文字列に指定されたStringBufferと同じ順序の文字が含まれている場合にのみ、trueを返します。
7 静的文字列copyValueOf(char [] data) 指定された配列の文字シーケンスを表す文字列を返します。
8 static String copyValueOf(char] data、int offset、int count) 指定された配列の文字シーケンスを表す文字列を返します。
9 ブール値endsWith(文字列サフィックス) この文字列が指定されたサフィックスで終わるかどうかをテストします。
10 boolean equals(Object anObject) この文字列を指定されたオブジェクトと比較します。
11 boolean equalsIgnoreCase(String anotherString) 大文字と小文字を区別せずに、この文字列を別の文字列と比較してください。
12 [バイト] getBytes() プラットフォームのデフォルトの文字セットを使用して、この文字列をバイトシーケンスにエンコードし、結果を新しいバイト配列に格納します。
13 [バイト] getBytes(String charsetName) 指定された文字セットを使用して、この文字列をバイトシーケンスにエンコードし、結果を新しいバイト配列に格納します。
14 void getChars(int srcBegin、int srcEnd、char [] dst、int dstBegin) この文字列からターゲット文字配列に文字をコピーします。
15 int hashCode() この文字列のハッシュコードを返します。
16 int indexOf(int ch) この文字列で指定された文字が最初に出現するインデックスを返します。
17 int indexOf(int ch、int fromIndex) この文字列で最初に出現する文字のインデックスを返し、指定されたインデックスから検索を開始します。
1 int indexOf(String str) この文字列で指定されたサブ文字列が最初に出現するインデックスを返します。
19 int indexOf(String str、int fromIndex) 指定されたインデックスから開始して、この文字列で指定されたサブストリングが最初に出現するインデックスを返します。
20 文字列intern() 文字列オブジェクトの正規化された表現を返します。
21 int lastIndexOf(int ch) この文字列で指定された文字が最後に出現したインデックスを返します。
22 int lastIndexOf(int ch、int fromIndex) この文字列で最後に出現した文字のインデックスを返し、指定されたインデックスから逆方向に検索します。
23 int lastIndexOf(String str) この文字列で指定されたサブ文字列の右端にあるインデックスを返します。
24 int lastIndexOf(String str、int fromIndex) この文字列内で最後に出現したサブストリングのインデックスを返し、指定されたインデックスから逆方向に検索します。
25 int length() この文字列の長さを返します。
26 ブール値の一致(文字列正規表現) この文字列が指定された正規式と一致するかどうかを確認します。
27 boolean regionMatches(boolean ignoreCase、int toffset、String other、int ooffset、int len) 2つの文字列領域が等しいかどうかをテストします。
28 boolean regionMatches(int toffset、String other、int ooffset、int len) 2つの文字列領域が等しいかどうかをテストします。
29 String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
30 String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
31 String replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
32 [String] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
33 [String] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。
34 boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始。
35 boolean startsWith(String prefix, int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
36 CharSequence subSequence(int beginIndex, int endIndex) 返回一个新的字符序列,它是此序列的一个子序列。
37 String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。
38 String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。
39 [char] toCharArray() 将此字符串转换为一个新的字符数组。
40 String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
41 String toLowerCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。
42 String toString() 返回此对象本身(它已经是一个字符串!)。
43 String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
44 String toUpperCase(Locale locale) 使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。
45 String trim() 返回字符串的副本,忽略前导空白和尾部空白。
46 static String valueOf(primitive data type x) 返回给定data type类型x参数的字符串表示形式。
47 contains(CharSequence chars) 判断是否包含指定的字符系列。
48 isEmpty() 判断字符串是否为空。

おすすめ

転載: blog.csdn.net/lmhnba/article/details/108741848
おすすめ