面对对象基础、数组_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) 按字典顺序比较两个字符串。
int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。
5 String concat(String str) 将指定字符串连接到此字符串的结尾。
6 boolean contentEquals(StringBuffer sb) 当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。
7 static String copyValueOf(char[] data) 返回指定数组中表示该字符序列的 String。
8 static String copyValueOf(char] data, int offset, int count) 返回指定数组中表示该字符序列的 String。
9 boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束。
10 boolean equals(Object anObject) 将此字符串与指定的对象比较。
11 boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。
12 [byte] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
13 [byte] getBytes(String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
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 String 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 boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。
27 boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。
28 boolean regionMatches(int toffset, String other, int ooffset, int len) 测试两个字符串区域是否相等。
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
今日推荐