java面向对象编程(初级)

1.类与对象

在这里插入图片描述

  1. 类是抽象的,概念的,代表一类事物,比如人类,猫类。。。,即是数据类型
  2. 对象是具体的,实际的,代表一个具体事务,即 是实例
  3. 类是对象的模板,对象是类的一个个体,对应一个实例
对象的内存布局
Cat cat=new Cat();
cat.name="小白";
cat.age=2;
cat.color="白色"

定义一个类
cat类的内存布局

属性/成员变量
  1. 概念:成员变量=属性=field字段(即成员变量是用来表示属性的)
    eg:
    Cat(name,price,color);
  2. 属性是类的一个组成部分,一般是基本数据类型,也可以是引用数据类型(对象,数字)。
    图中的四个都是成员变量,属性
  3. 注意事项和细节说明
    1. 属性的定义语法和变量相同 eg:访问修饰符 属性类型 属性名
      四种访问修饰符:public protected 默认 private
    2. 属性的定义类型可以为任意类型,包含基本类型或引用类型
    3. 属性如果不赋值,有默认值,规则和数组一致
      int 0, short 0, byte 0, long 0, float 0, double 0.0, char \u0000, boolean false. String null
创建对象
  1. 先声明再创建
Cat cat;//内存中创建了第一步
cat = new Cat();//内存中创建了第二步

在这里插入图片描述

  1. 直接创建
Cat cat = new Cat();
类和对象的内存分配机制

求问p2.age是多少?

java内存的结构分析
1. 栈:一般存放基本数据类型(局部变量)
2. 堆:存放对象(Cat cat,数组等)
3. 方法区:常量池(常量,比如字符串),类加载信息
4. 示意图[Cat(name,age,price)]

Java创建对象的流程简单分析:

Person p= new Person();
p.name = "jack";
p.age = 10;
1. 先加载Person类信息(属性和方法信息,只会加载一次)
2. 在堆中分配空间,进行默认初始化(看规则)
3.  把地址赋给p
4. 进行指定初始化

在这里插入图片描述

2.成员方法

方法的调用机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
方法调用小结:
1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2.当方法执行完毕,或者执行到return语句就会返回
3.返回到调用方法
4.返回后继续执行

成员方法的定义

public 返回数据类型 方法名 (参数列表…)
{//方法体语句;
return 返回值;
}

  1. 参数列表:表示成员方法输入cal(int n)
  2. 数据类型(返回类型)
  3. 方法主体:表示为了实现某一功能代码块
  4. return 语句不是必须的

3.成员方法传参

  1. 基本数据类型:值不发生改变(在栈中有另一个地址,并不会改变原有的值)
  2. 引用数组类型:改变(他们的内存地址是共享的)

4.overload(方法重载)

基本介绍:
java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致
在这里插入图片描述
方法名:必须相同
形参列表:必须不同
返回类型:无要求

5.可变参数

java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法

基本语法
访问修饰符 返回类型 方法名(数据类型。。。。形参名){
}
在这里插入图片描述
1.可变参数的实参可以为0个或者任意多个
2.可变参数的实参可以为数组
3.可变参数的本质就是数组
4.可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
5.一个形参列表只能出现一个可变参数

6.作用域

1.在java编程中,主要的变量就是属性(成员变量)和局部变量。
2.局部变量一般指在成员方法中定义的变量
3.作用域分类:
全局变量:属性,作用域为整个类体
局部变量:除了属性以外的变量,作用域在代码块中
4.全局变量可以不赋值,直接使用(会给默认值,规则同数组)。局部变量必须赋值后才可使用(无默认值)。
细节:
1.属性和局部变量可以重名,访问时遵循就近原则
2.在同一个作用域中,两个局部变量不能重名
3.属性生命周期长,伴随对象的创建而创建,伴随对象的死亡而死亡。局部变量,生命周期短,伴随代码块的执行而创建,伴随代码块的结束而死亡,仅在一次方法调用过程中。
4.作用域不同
全局变量:可以本类使用,也可以其他类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用
5.修饰符不同
全局变量/属性可以加修饰符
局部变量不可以加修饰符

7.构造器(constructor)

完成对新对象的初始化

原来:先创建“人类”对象,再对“年龄”“姓名”属性赋值
构造器:创建人类对象,直接指定对象的年龄姓名

语法:
[修饰符] 方法名 (形参列表){
方法体;
}
1.构造器修饰符可以默认
2.构造器没有返回值
3.方法名和类名一样
4.参数列表 和 成员方法一样规则
5.创建对象时,系统会自动调用该构造器完成对象初始化

在这里插入图片描述
细节:
1.一个类可以定义多个不同的构造器,即构造器重载
2.构造器名和类名要相同
3.构造器没有返回值
4.构造器是完成对象初始化,并不是创建对象
5.创建对象时自动调用该类的构造方法
6.如果程序员没有定义构造器,系统会自动给类生成一个默认无参的构造方法 (默认构造方法),比如Person(){} 。
7. 一旦定义了自己的构造器,默认的构造器就覆盖了,不能再使用默认的无参构造器。

对象创建的流程分析在这里插入图片描述
1.在方法区加载Person类,只会加载一次
2.在堆分配一个空间(存放age name)
3.首先进行默认初始化,age空间赋值0,name空间赋值null
4.进行显示初始化,age空间90,name空间null
开始初始化:
5.发现有构造器,age是20,name是小倩
6.将对象在堆中的地址赋给p(p是对象名,也可以理解为是对象的引用)
在这里插入图片描述

8.this

java虚拟机会给每个对象分配this,代表当前对象。
在这里插入图片描述
哪个对象调用,this就代表哪个对象
细节:
1.this可以用来访问本类的属性,方法,构造器
2.this用于区分当前类的属性和局部变量
3.访问成员方法:this.方法名(参数列表)
4.访问构造器:this(参数列表)
5.不能在类定义的外部使用

  1. this关键字最常用于构造方法中,初始化实例属性(和python中的self是一样的性质)
class Dog {
    
    int age ;
    String name ;
    
    public Dog(int age, String name){
        
        //1、在构造方法中用于初始化参数(用于区分属性和入参)
        this.age =age;
        this.name =name;
    }
    
    public void demo(){
        System.out.println("demo执行");
    }
    
    public void demo1(){
        //在普通的实例方法中,可以添加this调用属性/方法
        this.age =1000;
        this.demo();
        
        //一般情况,我们调用实例属性/实例方法时不需要添加this,编译器会自动添加
        name ="小黑";
        demo();
    }
}
  1. this()方法
    this()表示调用构造方法,此种调用只能用在构造方法中,即构造方法中调用构造方法this(实参)。
    1、this()、this(实参)必须方法构造方法的第一行
    2、在有参数构造方法中调用无参数构造方法this();在无参数的构造方法中调用有参数的构造方法this(实参)
    一、如下是无参数构造方法调用有参数构造方法:
public class Constractor
{
    int year;
    int month;
    int day;
    
    //无参数构造方法
    public Constractor()
    {
        this(2019,1,1);
    
    }

    //有参数构造方法
    Constractor(int year, int month, int day)
    {
        
        this.year = year;
        this.month = month;
        this.day = day;
    }

}
		二、如下是有参数构造方法调用无参数构造方法:
public class Constractor
{
    int year;
    int month;
    int day;
    
    //无参数构造方法
    public Constractor()
    {
    
    }

    //有参数构造方法
    Constractor(int year, int month, int day)
    {
        this();
        
        this.year = year;
        this.month = month;
        this.day = day;
    }

}
		三、this()/this(实参)必须出现在构造方法的第一行,否则报错
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值