1.对象的创建(实例化)

Cat cat; //声明
cat = new Cat(); //开辟空间,把地址赋值给cat;

  1. public class Cat {
  2. String name=null;
  3. int age=0;
  4. String color=null;
  5. /*
  6. public Cat(String name, int age, String color) {//构造函数
  7. this.name = name;
  8. this.age = age;
  9. this.color = color;
  10. }*/
  11. }
  12. //======================cat.java=======================================
  13. public class Hello {
  14. public static void main(String[] args){
  15. //Cat A=new Cat("小黑",5,"白色");//调用的构造函数
  16. Cat B;
  17. B=new Cat();
  18. B.color="白色";
  19. B.age=55;
  20. B.name="小花";//普通调用cat对象,注意,当cat.java创建了构造函数时。就不能用此种方法了
  21. }}
  22. //======================Hello.java=======================================

注意:对象也是引用类型,和数组一样,两个数组相等,改变其一,另外一个的内容也会随之改变。

2.方法的封装与调用

类内部调用:

  1. public class Hello {
  2. public static void main(String[] args){
  3. System.out.println(DecToHex(31));}
  4. static String DecToHex(int num){
  5. StringBuffer stringBuffer = new StringBuffer();
  6. char []chars = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  7. while (num>0){
  8. int index= num % 16;//取余
  9. char tmp = chars[index];//取出对应的十六进制的数值
  10. stringBuffer.append(tmp);
  11. num=num/16;
  12. }
  13. return stringBuffer.reverse().toString();};}

外部调用:

  1. public class Cat {
  2. static void test(){
  3. System.out.println("123");
  4. }
  5. }
  6. //=====================Cat.java========================
  7. public class Hello {
  8. public static void main(String[] args){
  9. Cat cat1 = new Cat();
  10. Cat.test();}}
  11. //=====================Hello.java========================

3.static

  1. 静态属性(类属性)
    静态属性可以通过 类名.属性名/对象.属性名 来赋值和访问
    静态属性只有一份
    静态属性生命周期与类相同,存储于堆中class实例的尾部(JDK7以上)
  2. 实例属性(对象属性)
    实例属性每个对象都有一份
    实例属性只能通过 对象.属性名 来赋值和访问
    实例属性生命周期与对象相同,存储于堆中
  3. 静态方法与实例方法(对象方法)
    静态方法和实例方法都随着类一起加载,存储与方法区
    静态方法可以通过 类名.方法名/对象.方法名 来访问
    静态方法中只能调用静态方法,只能访问静态属性
    实例方法中可以调用静态方法和实例方法,也可以访问静态属性和实例属性
  4. main方法
    main方法可以直接调用所在类的静态方法或静态属性
    main方法不能直接访问所在类中的实例成员,必须创建对象后,才能通过对象去访问 ```java public class Cat { static String color=null; } //=====================Cat.java======================== public class Hello { public static void main(String[] args){
    1. Cat cat1 = new Cat();
    2. cat1.color ="白色" ;
    3. System.out.println(cat1.color);//"白色"
    4. Cat.color="黑色";
    5. System.out.println(Cat.color);//"黑色"
    }} //=====================Hello.java======================== //结论,用static修饰过后的变量,就像是个一辆共享单车,只有一辆,但是谁都可以使用,谁都可以改变他的值; //静态方法中,不能直接使用实例方法(先new一下);
  1. <a name="CvN3l"></a>
  2. #### 4.重载
  3. 概念:<br />同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同或者参数顺序不同即可; <br />与返回值类型无关,只看参数列表;
  4. ```java
  5. public class Hello {
  6. public static void main(String[] args){}
  7. static int test(int a){return 1;};
  8. static int test(double a){return 1;};
  9. static int test(String a){return 1;};
  10. }

5.可变参数

  1. public class Hello {
  2. public static void main(String[] args){
  3. System.out.println(test(1,2,3,4,5));//传入参数可以为一个数组,传入数组的时候,就只能传入一个参数了
  4. }
  5. static int test(int ...a){//三个点代表可变参数 ,传入的a本质上是个数组
  6. int result =0;
  7. for (int i = 0; i < a.length; i++) {
  8. result=result+a[i];
  9. }
  10. return result;
  11. };
  12. }

6.构造器/构造方法/构造函数

构造器名和类名一致,没有返回值
当对象创建的时候,会自动调用对应的构造器如果没有定义构造器,会自动生成默认的无参构造器(也叫默认构造器)
一个类可以定义多个不同的构造器,即构造器重载
一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非自己显式的定义一下

7.this

  1. public class Cat {
  2. String color=null;
  3. public Cat(String color) {
  4. this.color = color;
  5. System.out.println(this.hashCode());}}
  6. //=====================Cat.java========================
  7. public class Hello {
  8. public static void main(String[] args){
  9. Cat cat1 = new Cat("白色");
  10. System.out.println(cat1.hashCode());
  11. System.out.println("==================");
  12. Cat cat2 = new Cat("黑色");
  13. System.out.println(cat2.hashCode());
  14. }
  15. }
  16. //=====================Hello.java========================
  17. /*
  18. 356573597 指向cat1
  19. 356573597
  20. ==================
  21. 1735600054 指向cat2
  22. 1735600054
  23. */
  24. //说明谁调用,这个this就指向谁。

this用于区分当前对象的属性和局部变量
this不能在类外部使用,只能在类内部实例方法中使用;
this不能在静态代码块里面使用,因为静态代码块会随着对象的创建而加载,这是this并没有被谁指向;

this(实参列表):用于构造方法之间的访问,必须是构造器中的第一个语句,如一下代码:

  1. public class Cat {
  2. int num=0;
  3. String color=null;
  4. public Cat(String color) {
  5. this(5,6);//调用点
  6. this.color = color;
  7. }
  8. public Cat(int num,int num1) {
  9. this.num=num;
  10. System.out.println(1111);
  11. }
  12. }
  13. //=====================Cat.java========================
  14. public class Hello {
  15. public static void main(String[] args){
  16. Cat cat1 = new Cat("白色");
  17. }
  18. }
  19. //=====================Hello.java========================

8.包

  1. 包的三大作用:
  • 区分相同名字的类
  • 当类很多时,可以很好的管理类
  • 控制访问范围
  1. 建包
  • 包,实际上就是创建不同的文件夹/目录来保存类文件
    1. package com.dudu.app;
    2. public class people {
    3. String name=null;
    4. public people(String name) {
    5. this.name = name;
    6. System.out.println(this.name );
    7. }
    8. }
    9. //===============================package com.dudu.app;=======================
    10. import com.dudu.app.people;
    11. public class Hello {
    12. public static void main(String[] args){
    13. people people1 = new people("aaa");
    14. }
    15. }
    16. //===============================Hello.java;=======================

    9.访问修饰符image.png

  1. 访问修饰符用于控制属性和方法的访问权限(范围)
  2. 修饰符可以用来修饰类中的属性,成员方法以及类
  3. 只有默认的和public才能修饰类,并且遵循上述访问权限的特点

    10.封装

  4. 封装的好处

  • 隐藏实现细节,使用的人只需知道传入什么参数,会产生什么效果,返回什么数据对属性进行操作时,可以验证传入数据的合理性把属性私有,定义公开的get、set方法来验证数据合理性;
  1. 封装例子: ```java package com.dudu.app; public class people { private String name=null; private int age =0;

    public String getName() {

    1. return name;

    }

    public void setName(String name) {

    1. if(name.length()!=0){ this.name = name;System.out.println("将封装的变量私有化,然后通过方法进行访问操作,可以验证传入数据的合理性");
    2. }
    3. else {
    4. }

    }

    public int getAge() {

    1. return age;

    }

    public void setAge(int age) {

    1. System.out.println("将封装的变量私有化,然后通过方法进行访问操作,可以验证传入数据的合理性");
    2. this.age = age;

    } } //===============================package com.dudu.app;======================= import com.dudu.app.people; public class Hello { public static void main(String[] args){

    1. people people1 = new people();
    2. people1.setName("你好");
    3. people1.setAge(55);

    } } //===============================Hello.java;=======================

  1. <a name="IVJvH"></a>
  2. #### 11.继承
  3. 1. 作用
  4. - 提高代码复用性
  5. - 继承是多态的前提
  6. 2. 继承的语法
  7. - class 子类 extends 父类{ }
  8. - 例子
  9. ```java
  10. package com.dudu.app;
  11. public class people {
  12. private String name=null;
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. }
  20. //===============================people.java;=======================
  21. package com.dudu.app;
  22. public class students extends people{
  23. private boolean learn;
  24. public boolean isLearn() {
  25. return learn;
  26. }
  27. public void setLearn(boolean learn) {
  28. this.learn = learn;
  29. }
  30. }
  31. //===============================students.java;=======================
  32. import com.dudu.app.students;
  33. public class Hello {
  34. public static void main(String[] args){
  35. students students1 = new students();
  36. students1.setName("实例化的是students,通关students继承people访问people里面的属性");
  37. System.out.println(students1.getName());
  38. }
  39. }
  40. //===============================Hello.java;=======================

12.父类构造器

  1. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器(注:不用super的话,父类必定有无参构造器,不然报错)
  2. super();如果父类没有提供无参构造器,则须在子类构造器中用super去指定使用父类的哪个构造器 super(参数列表); super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
  3. 父类构造器的调用不限于直接父类,一直往上追溯到Object类(顶级父类)
  4. 访问父类的属性(受访问修饰符影响) super.属性名;
  5. 访问父类的方法(受访问修饰符影响) super.方法名(参数列表);
  6. 如果父类没有,super会向上找爷爷类,以此类推
  7. 如果父类和爷爷类都有,但是父类是private,那么也会报错
  8. java: 无法从静态上下文中引用非静态 变量 super(),即无法从带有static的类里面调用父类或者爷爷类的属性或者方法; ```java package com.dudu.app; public class test { public String tttt=”ttttpppppppppp”; } //===============================test.java;======================= package com.dudu.app; public class people extends test{ public String TEST=”TEST_people”; private String name=null; public people() {

    1. System.out.println("父类无参构造器");

    } public people(String name) {

    1. this.name = name;
    2. System.out.println("父类有参数构造器"+this.name);

    }

    public String getName() {

    1. return name;

    } public void setName(String name) {

    1. this.name = name;

    } }

//===============================people.java;======================= package com.dudu.app; public class students extends people{ private boolean learn;

  1. public students(boolean learn) {
  2. super(" dudu");//指定调用父类有参数的构造器
  3. this.learn = learn;
  4. }
  5. public boolean isLearn() {
  6. return learn;
  7. }
  8. public void setLearn(boolean learn) {
  9. this.learn = learn;
  10. }
  11. public void call() {
  12. System.out.println(super.tttt);//ttttpppppppppp
  13. }//这个就是,父类继承了爷爷类的属性,父类没有,也可以直接调用的;

} //===============================students.java;=======================

  1. <a name="fb3hD"></a>
  2. #### 13.方法重写
  3. a) 方法重写也叫方法覆盖;<br />b) 子类方法的名称、参数,与父类完全相同;<br />c) 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类 ;比如父类返回类型是Object,子类方法返回类型是String <br />d) 子类方法不能缩小父类方法的访问权限,即访问修饰符;
  4. ```java
  5. package com.dudu.app;
  6. public class test {
  7. public String tttt="tttt";
  8. public String rename(){
  9. return "方法重写_父类";
  10. }
  11. }
  12. //===============================test.java;=======================
  13. package com.dudu.app;
  14. public class people extends test{
  15. public String rename(){
  16. return "方法重写_子类";
  17. }
  18. }
  19. //===============================people.java;=======================

14.代码块

  1. 创建对象时的调用顺序
    ① 父类的静态代码块和静态属性初始化
    ② 子类的静态代码块和静态属性初始化
    ③ 父类的普通代码块和普通属性初始化
    ④ 父类的构造方法
    ⑤ 子类的普通代码块和普通属性初始化
    ⑥ 子类的构造方法