Java面向对象(类、方法重载、this关键字)

一、什么是对象

程序员眼里的面向对象思想

  • 一切客观存在的食物都是对象,即:“万物皆对象”
  • 任何对象一定具有自己的特征和行为(即:属性和方法)
  • 特征: 称为属性,一般为名词,代表对象有什么
  • 行为: 称为方法,一般为动词,代表对象能做什么
  • 现实中的对象多数来自于“模板”,而程序中的对象也不例外也具有相应的“模板”

对象的创建:

public class classDemo1 {
    public static void main(String[] args) {
        Dog myDog = new Dog();                               //基于Dog类创建对象

        myDog.breed = "萨摩";                              //访问属性:对象名.属性名 =  值; //赋值
        myDog.age = 2;
        myDog.sex = "公";
        myDog.furColor = "白色";

        System.out.println(myDog.breed + "\t" + myDog.age + "\t" + myDog.sex + "\t" + myDog.furColor);
//      访问属性:对象名.属性名; //取值
        myDog.eat( );
        myDog.sleep( );
//        调用方法:对象名.方法名( );
    }
}

对象创建过程:

public class demo {
    public static void main(String[] args) {
        Student1 s = new Student1();                 // new Student1(); 触发对象创建
    }
}
class  Student1{                                     //1.内存中开辟空间
    String name;                                     //2.为各个属性赋予初始值
    int age;                                         //3.执行构造方法中的代码
    String sex;                                      //4.[将对象的地址赋值给变量]
    double score;

    public  Student1(){
        System.out.println("Student() Executed");
    }
}

对象中的内存分布:

存储对象的变量中保存对象的地址,通过变量中的地址访问对象的属性和方法

二、什么是类

什么是类?

类(Class)是面向对象程序设计实现信息封装的基础

类的定义:

public class Dog{
    String breed; //品种                      属性:通过变量表示,又称实例方法,又称实例变量。
    int age; //年龄                           语法:数据类型 属性名;
    String Sex; //性别                        位置:类的内部,方法的外部。
    String furColor; //毛色

    public void eat(){                        //方法:通过函数表示,又称实例方法
        System.out.println("eating...");      //语法:
    }                                         //     public 返回值类型 方法名(形参){
    public  void sleep(){                     //     //方法的主体
        System.out.println("sleeping...");    //}
    }
}

三、类的组成

  • 属性: 比如:学生的属性有姓名、性别、出生年月、家庭住址、电话等
  • 比如: 学生的行为(也就是方法)有学习、打游戏、看电影等

类与对象的关系:

  • 类: 定义了对象具有的特征和行为,类是对象的模板
  • 对象: 拥有多个特征和行为的实体,对象是类的实例

实例变量:

  • 思考:之前学习局部变量时,要求先赋值再使用,否则编译错误。对于实例变量而言,未赋值并不会编译错误,能否直接访问?
public class classDemo1 {
    public static void main(String[] args) {
        Dog myDog = new Dog();                               //基于Dog类创建对象
//		实例变量的默认值: 整数:0	小数:0.0	字符:\u0000 (空格)	布尔:False	其他:null
//      省略赋值语句
        
        System.out.println(myDog.breed + "\t" + myDog.age + "\t" + myDog.sex + "\t" + myDog.furColor);
//		运行结果: null 0 null null
    }
}

实例变量与局部变量的区别:

种类 局部变量 成员变量
定义位置 方法或方法内的构造当中 类的内部,方法的外部
默认值 无默认值 字面值与数组相同
适用范围 从定义行到包含其构造结束 本类有效
命名冲突 不允许重名 可与局部变量重名,局部变量优先

实例方法:

实例方法包含两部分: 方法的声明和方法的实现

  • 方法的声明:
    • 代表对象能做什么
    • 组成: 修饰符、返回值类型和方法名(形参列表)
  • 方法的实现:
    • 代表对象怎么做: 即如何实现对应的功能
    • 组成:{}

四、方法重载

什么是方法的重载?

  • 一个类中定义多个相同名称的方法
  • 要求:
    • 方法名称相同
    • 参数列表不同(类型、个数、顺序)
    • 与访问修饰符、返回值无关
  • 好处: 屏蔽使用差异、灵活、方便

注意:只是参数不同并不能构成方法的重载。

  • 有些情况下,对象的同一种行为可能存在多种实现过程。
  • 例如:人对象的eat行为,吃饭,吃药和嚼口香糖的过程就存在差异。
public class Person{
    public void eat(食物 a){
        //食物放入口中
        //咀嚼
        //咽下
    }
    public void eat(药物 b){
        //药物放入口中
        //喝水
        //咽下
    }
    public void eat(口香糖 c){
        //口香糖放入口中
        //咀嚼
        //吐出
    }
}

五、构造方法

什么是构造方法呢?

  • 类中的特殊方法,主要用于创建对象
  • 特点:
    • 名称与类名完全相同
    • 没有返回值类型
    • 创建对象时,触发构造方法的调用,不可通过句点手动调用

注意:如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法

构造方法的重载:

构造方法也可以重载,遵循重载规则

public class demo {
    public static void main(String[] args) {
//        Student1 s = new Student1();
        new Student1();
        new Student1("tom");
        new Student1("jack", 20);
//        创建对象时,根据传入参数,匹配对应的构造方法。
    }
}
class  Student1{
    String name;
    int age;
    String sex;
    double score;

    public Student1(){
        System.out.println("Student1() Executed");
    }
    public Student1(String name){
    	System.out.println("Student1(String name) Executed");
    }
    public Student1(String name,int age){
        System.out.println("Student1(String name,int age) Executed");
    }
}
/*
输出结果:
Student1() Executed
Student1(String name) Executed
Student1(String name,int age) Executed
*/

默认构造方法:

public class demo {
    public static void main(String[] args) {
        Student1 s = new Student1(); //编译错误:无参构造方法未定义
    }
}
class  Student1{
    String name;                    //在类中,如果没有显示定义构造方法,则编译器默认提供无参构造方法。
    int age;
    String sex;
    double score;

    public Student1(String n, int a, String s, double sc){
     //如果已经手动添加有参构造方法,则无参构造方法不在默认提供,可更具需求自行添加。
    }
}

构造方法为属性赋值:

public class demo {
    public static void main(String[] args) {
        Student1 s = new Student1("tom", 20,"male", 98.5);    //创建对象的同时,将值传入构造方法
        System.out.println(s.name + "\t" + s.age + "\t" + s.sex + "\t" + s.score);
    }
}
class  Student1{
    String name;                    //tom 20 male 98.5
    int age;
    String sex;
    double score;

    public Student1(String n, int a, String s, double sc){
        name = n;
        age = a;
        sex = s;
        score = sc;                 //由构造方法为各个属性赋值
    }
}

六、this关键字

public class demo {
    public static void main(String[] args) {
        Student1 s1 = new Student1();  //0x0000A0001
        s1.sayHi();           //创建对象s1时,this指向0x0000A0001,访问的name属性即是0x0000A0001地址中的name空间。
        Student1 s2 = new Student1();  //0x0000A0002
        s2.sayHi();           //创建对象s2时,this指向0x0000A0002,访问的name属性即是0x0000A0002地址中的name空间。
    }
}
class  Student1{
    String name;                    
    int age;
    String sex;
    double score;

    public void sayHi(){
//      类是模板,可服务于此类的所有对象,当类服务于某个对象时,this则指向这个对象。
        System.out.println(this.name); // this是类中的默认引用,代表当前实例。
    }
}

this关键字的用法:

  1. 调用实例属性、实例方法,如:this.name、this.sayHi();
public class demo {
    public static void main(String[] args) {
        Student1 s1 = new Student1();  //0x0000A0001
        s1.sayHi();
    }
}
class Student1{
    String name = "tom";

    public void sayHi(){
        String name = "jack"; //当实例变量与局部变量重名时,优先访问局部变量;此时如需访问实例变量则需要this.前缀。
        System.out.println(name); //不存在重名时,则可以省略this
        System.out.println(this.name);
    }
}
/*
jack
tom
*/
  1. 调用本类中其他构造方法,如:this(); this(实参);
class student1{
    String name;
    int age;
    String sex;
    Double score;

    public student1(String name, int age, String sex){
        this.name = name;        //在构造方法中,调用本类其他构造方法,即可复用构造方法中的逻辑代码。
        this.age = age;
        this.sex = sex;
    }

    public student1(String name, int age, String sex,Double score){
        this(name, age, sex);    //this(实参):调用有参构造 必须在构造方法的首行
//        四参构造方法将接收到的实参直接传递给三参构造进行属性赋值。
        this.score = score;      // this():调用无参构造
    }
}

本笔记仅限参考使用

参考博客:https://blog.csdn.net/weixin_44170221/article/details/104310533

posted @ 2021-10-10 13:08  与君同是江南客  阅读(87)  评论(0)    收藏  举报