JAVA笔记(七)--类和面向对象

170 阅读9分钟

**本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接 **

java的核心思想是面向对象

OO:Object Oriented 面向对象

OOP:面向对象编程

OOD:面向对象设计

OOA:面向对象分析

1.对象:

​ a.对象:用来描述客观事物存在的一个实体,对象由一组属性和方法构成

​ b.组成:

属性: 对象特征描述,静态描述

方法: 对象的执行操作,动态描述

2.类:

a.what: 将实际存在的对象的共同属性和方法进行抽象得到的概念为类

是模子,定义对象将会拥有的特征(属性)和行为(方法)

3.类和对象的关系:

​ 类是对象的抽象,对象是类的具体实现

4.java面向对象编程:

a. 所有java程序都是以类 class作为组成单元

​ 关键字class其实就是自定义数据类型

b.语法:

public class 类名{
    //属性定义
    属性类型1   属性1;
    属性类型2,属性2;
          ...
    //方法定义
    方法1;
    方法2;
    ...
}

c.具体使用:

步骤: 编写类名-编写属性-编写方法

对象类包命名规则: .vo/.entity/.pojo

d.对象的创建和调用:

创建:

类名 对象名 = new 类名();

​ new表示创建对象

使用:

​ 对象名.属性 如果直接调用表示将该对象的属性获取,如果添加参数则表示给该对象属性赋值

​ 对象名.方法 执行该对象的方法

e.对象调用注意事项:

​ 属性在类中创建不进行赋值--定义在类中的变量为全局变量,全局变量系统会自动将默认值进行赋值;

          int---0
          double---0.0
          char ---Unicode
          boolean---false
          String---null

​ 如果在定义类属性时直接赋值,则表示进行初始化,通过该类创建的对象均使用该值(后期不更改)

5、类的方法

a.定义语法:

<权限修饰符> 返回值类型 方法名(<参数列表>){
    方法体
    <return 返回值>
}

权限修饰符: public指定类与类之间的调用范围,可省略

返回值类型: 指定返回值的具体数据类型,void为无返回值的返回值类型

方法名: 指定当前方法的名称,用于后期调用,严格按照命名规则

参数列表: 参数个数和类型,可省略

**return : ** 如果有返回值,表示指定返回值,return 只能出现在该方法体的最后一句

b.返回值:

return只能放在方法的最后一句

c.方法调用:

方法之间允许相互调用,不需要知道方法的具体实现,实现重用,提高效率

场景一:

当前类自己方法调用自己方法

public void a(){
    b();
}

场景二:

当前类方法调用其他类方法

public void a(){
    B b=new B();
    b.b();
}

6.全局变量和局部变量

a.作用域不同:

全局变量: 在类中定义的变量为全局变量,作用域为整个类

局部变量: 在方法体或特定内容中的变量,作用域为方法体或特定区域,如for{}

b.对比

​ 全局变量使用时可以不赋值,系统直接提供默认值,局部变量使用前一定要先赋值;

​ 局部变量中不允许重名,但是全局变量和局部变量可以重名,重名使用局部变量中的内容,内容进行覆盖;

注意:

在同一个方法中,不允许有同名局部变量,在不同的方法中,可以有同名局部变量在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级

7.带参方法:

a.why: 在很多场合,需要执行相似操作,将相似操作作为一个方法编写,不同的内容作为参数传入执行,从而达到一个方法体输出不同结果

b.语法:

<权限修饰符> 返回值类型   方法名 (<形式参数列表>){
    方法体
}

**修饰符: ** 指定该方法的执行范围:当前类,子类,同包,不同包;

返回值类型: void:无返回值类型;String...根据实际需求指定返回值类型;

方法名: 指定方法名称,驼峰命名规则;

参数列表: 参数个数和参数类型统称为参数列表;

方法的参数列表没有实际值,为 形参,

在调用执行该方法的时候传入的参数才有实际值,为 实参;

注意:

在调用方法的时候实参列表要一一对应;

多个参数传递时一定注意顺序问题

思考问题:

​ 参数传递是否可以使用对象?

​ 返回值是否可以返回对象?

​ 数组是否可以存储对象?

补充:

包的命名规范问题:

"." 作为连接符号,但是不能为开头和结尾;

包名 是域名的倒装加上项目名等组成;

8、类图:

​ a. 属性前 "+"表示public, "-"表示private

	方法参数列表需要指定类型	

​ b.绘制工具

9、构造方法:

a.what: 特殊的方法

b.语法:

修饰符 方法名(参数列表){
    方法体
}

构造方法没有返回值类型;

​ 构造方法的方法名同所在的类名一致;

​ 构造方法在同一个类中可以同时出现多个,但是每一个与其他之间的参数列表是不同--- 重载

​ **重点: ** 每一个类都有构造方法,如果人为给出指定构造方法该无参构造方法消失

​ **建议: ** 以后创建类的时候人为指定构造方法,即使是无参构造方法

c.作用: 完成初始化,可以使用该功能进行创建对象的时候直接给属性赋值

10、方法重载:

​ 在同一个类中,方法名相同,参数列表(参数个数,参数类型,类型顺序)不同都为重载,和返回值与修饰符无关;

​ 使用方便,一般方法重载在构造函数的使用体现最广;

public class Demo { 
  //一个普通得方法,不带参数,无返回值
  public void add(){
    //method body
  }  
  //重载上面的方法,并且带了一个整形参数,无返回值
  public void add(int a){
    //method body
  }  
        //重载上面的方法,并且带了两个整型参数,返回值为int型
  public int add(int a,int b){
    //method body
    return 0;
  } 
}

11、this关键字:

a.调用属性

this.属性

​ 在构造函数的赋值中使用广泛

b.调用方法:

this.方法();

c.调用构造函数

this(); 表示该对象的无参构造方法

this(name); 表示该对象的该参数的构造方法;

12、static关键字:

​ static修饰的变量为静态变量;

​ static修饰的方法为静态方法;

​ 静态方法只能调用静态方法和静态变量;

​ 动态方法可以调用静态方法和动态方法,也可以调用静态变量和动态变量;

在其他类中调用:

  • 类名.静态方法;
  • 对象.静态方法;
  • 对象.动态方法;

13、方法执行:

  • 静态块: 类加载是执行,该方法只执行一次;
  • **动态块: ** 在创建对象的时候初始化,该方法只要创建一个对象执行一次
  • 构造方法: 在创建对象的时候初始化,该方法只要创建一个对应的对象是执行一次;
  • 静态方法: 类和对象都可以调用,调用的时候执行一次;
  • 动态方法: 对象可以调用,调用的时候执行一次;
  • **eg: ** 对象的id依次递增

14、封装:

​ **重点: ** 对象的三大特征之一 (抽象)、封装、继承、多态

a. 属性的权限为public表示公共的,任何类都可以直接进行操作,安全性不高?

​ -封装

b.what: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 (将属性私有化,并提供公共的访问方法)

c.语法:

  • private 属性
  • public void set属性(参数列表){} //设值方法
  • publci 返回值
  • get属性(){} //获取方法
public class Person{
    private String name;    private int age;    public int getAge(){
      return age;   
    }

    public String getName(){
      return name;    
    }

    public void setAge(int age){
      this.age = age;    
    }

    public void setName(String name){
      this.name = name;    
    }
}

d.好处:

​ 隐藏类的实现细节,只能通过规定的方法去获取数据,安全性高

​ 方法控制流程加入和修改实现

15、继承:

java中类为单继承

a.why: 多个类有重复相同的属性和方法,代码冗余,如何解决? --继承:

b.what: 子类继承类的所有属性和方法,并提供自己的特定属性和方法

c.语法:

​ 父类 : class 父类{ 封装 }

​ 子类 : class 子类 extends 父类{ 封装}

d.使用:

​ 1).子类对象创建方式:

方式一:Student student=new Student();	        

方式二:Person student2=new Student();  //父类引用指向子类对象	

​ 2).子类可以调用子类的,也可以调用父类

16、super: 同this使用效果

  • ​ super.属性:子类调用父类的属性,注意权限问题,哪些权限可以?
  • ​ super.方法():子类调用父类的公共方法;
  • ​ super()/super(属性):子类调用父类的构造方法;
  • ​ super()只能放在第一句

17、权限修饰符:

同类同包子类其他
private私有的
默认(不写)
protected受保护的
public公共的

18、方法重写:

a.why: 在某些场合,需要子类将父类的同名方法去进行补充扩展?

b.what: 子类将父类的同名方法重写编写的过程;

c.注意事项:

  • 方法名相同

  • 参数列表相同

  • 返回值类型相同或者是其子类

  • 访问权限不能严于父类

  • 构造方法不能被继承,所以不能被重写

  • 或者说

    1.方法重写时, 方法名与形参列表必须一致。 2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。 3.方法重写时,子类的返回值类型必须要小于或者 等于父类的返回值类型。 4.方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。

d.how:

​ 实际生活中,如果两个对象的属性值完全一样,则表示两个对象指定的是一个对象

​ -java代码中equals表示比较的是内容应该结果为true,但是实际为false?

​ -问题:equals哪来的?

​ ---Object类

​ -问题2:如果Object提供的equals无法满足实际需求?

​ equals方法重写