JavaSE(类和对象、this用法、构造方法)

1. 面向对象

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。
面向对象注重的是对象,也就是参与过程所涉及到的主体。是通过逻辑将一个个功能实现连接起来
面向对象就是用代码(类)来描述客观世界的事物的一种方式. 一个类主要包含一个事物的属性和行为

1. 注重洗衣服过程
在这里插入图片描述
2.注重洗衣对象
在这里插入图片描述
总共有四个对象:人、衣服、洗衣粉、洗衣机。

整个过程主要是:人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关心洗衣机具体是如何洗衣粉的,是如何甩干的。以面向对象的方式进行处理,就不需要关注洗衣服的过程,是通过对象之间的交互来完成的

什么是类

对象从何而来,从类来,你可以想象成一个类型,面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识。这个类我们要定义出来,该怎么定义呢?需要开发人员告诉给计算机什么是洗衣机。
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥)
在这里插入图片描述

比如:洗衣机,它是一个品牌,在Java中可以将其看成是一个类别。
属性:产品品牌,型号,产品重量,外观尺寸,颜色…
功能:洗衣,烘干、定时…
class为定义类的关键字,WashMachine为类的名字,{}中为类的主体(类体)。 类中的元素称为:成员属性(成员变量)。类中的函数称为:成员方法。

class WashMachine{
	public String brand; // 品牌
	public String type; // 型号
	public double weight; // 重量
	public double length; // 长
	public double width; // 宽
	public double height; // 高
	public String color; // 颜色
	public void washClothes(){ // 洗衣服
	System.out.println("洗衣功能");
	}
public void dryClothes(){ // 脱水
	System.out.println("脱水功能");
	}
public void setTime(){ // 定时
	System.out.println("定时功能");
	}
}

类new个对象

用类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

public class ClassAndObject {
    public static void main(String[] args) {
        // 现在我们有了类,那么怎么产生对象的呢? 通过  new 去实例化一个对象,也就是说去产生一个对象
        WashMachine xiyiji = new WashMachine();//xiyiji是一个变量
        // 注意此时的变量是由类定义的,由类定义的变量,都是引用变量,意味着初值可以赋 null

        // 而且 前面也说,同一个类,我们可以产生很多对象
        // 意味着 我们生成 很多人 xiyiji
         WashMachine xiyiji2 = new  WashMachine();
         WashMachine xiyiji3 = new  WashMachine();
         WashMachine xiyiji4 = new  WashMachine();
        //    ......
    }
}

在这里插入图片描述

类.成员变量

使用 . 来访问对象中的属性和方法.

public class ClassAndObject {
    public static void main(String[] args) {
        WashMachine xiyiji = new WashMachine();
       xiyiji.brand="苹果牌";
       xiyiji.length=100;
       xiyiji.washClothes();
       //.....
       System.out.println(xiyiji.length);
    }
}

类和对象的内存

在这里插入图片描述

public类名修改

注意事项:

  1. 一一个java文件当中只能定义一个public类
  2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
  3. public修饰的类必须要和文件名相同
  4. 不要轻易去修改public修饰的类的名称,要通过开发工具修改(src–>旧类名右击—>Refactor---->Rename—>新的类名)

在这里插入图片描述

类的说法易错点

在这里插入图片描述

2.this

为什么要有this引用

定义了一个日期类,然后main方法中创建了三个对象,并通过Date类中的成员方法对对象进行设置和打
印,代码整体逻辑非常简单,没有任何问题。

public class Date {
	public int year;
	public int month;
	public int day;
	public void setDay(int y, int m, int d){
	year = y;
	month = m;
	day = d;
	}
	public void printDate(){
	System.out.println(year + "/" + month + "/" + day);
	}
	public static void main(String[] args) {
	// 构造三个日期类型的对象 d1 d2 d3
	Date d1 = new Date();
	Date d2 = new Date();
	Date d3 = new Date();
	// 对d1,d2,d3的日期设置
	d1.setDay(2020,9,15);
	d2.setDay(2020,9,16);
	d3.setDay(2020,9,17);
	// 打印日期中的内容
	d1.printDate();
	d2.printDate();
	d3.printDate();
	}
}

但是细思之下有以下两个疑问?

  1. 形参名不小心与成员变量名相同
    public void setDay(int year, int month, int day){
    year = year;
    month = month;
    day = day;
    }
    结果就不能赋值,全部都是默认值0,原因是形参是局部变量,局部变量优先使用,不能对成员变量进行赋值。
  2. 三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和
    printDate函数如何知道打印的是那个对象的数据呢?

this引用的特性

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
    在这里插入图片描述
  2. this只能在"成员方法"中使用
  3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收
    在这里插入图片描述

在这里插入图片描述

this的用法

1.this.data 调用当前的对象的 属性/字段/成员变量
2.this.func() 调用当前的对象的方法
3.this() 调用当前对象的其他构造方法====类( )

class Date{
    public int year;

    public Date(){
        this();
        // 注意不能这么去写,因为 this() 表示调用当前对象的构造方法
        // 而现在Date 就是当前的构造方法,两者嵌套使用,会造成死循环
        // Date(){} 调用 this(), this() 调用 Date(){}
        // 而且编译器也出现 红色波浪线警告
        System.out.println("不带参数的构造方法");
   }
}

3. 构造方法

什么是构造方法?

这个方法没有返回值,方法名和类名是一样(都是Date)的。

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public Date(){//括号里不含参数
	System.out.println("不带参数的构造方法");
}
public Date(int x,char y,double z){//括号里含参数
	System.out.println("带参数的构造方法");
}
系统提供的:
public Date(){//什么都没有

}

不带参数:当你什么构造方法都没有写的时候,系统是默认给你写上一个不带参数的。
带参数:肯定就是你写的,也只会调用你写的,那系统就不会多此一举再提供了。
构造方法只会调用一次Date d = new Date();实例化对象调用

构造方法的作用?

在构造函数时就可以去初始化了,而不需要去构造一个类似于setDate这样的函数。

public class Date {
    public int year;
    public int month;
    public int day;
    public Date(int year,int month,int day) {
    //this();
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("调用了带有3个参数的构造方法!");
        this.show();
    }
    public void setDate(int year,int month,int day) {
        this.show();
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public void show() {
        System.out.println("年:"+this.year+" 月:"+this.month+" 日:"+this.day);
    }
    public static void main(String[] args) {
        Date date = new Date(2022,12,23);//传参
        date.show();
    }

}
输出结果:
调用了带有3个参数的构造方法!
年:2022 月:12 日:23
年:2022 月:12 日:23

通过this调用其他构造方法来简化代

public class Date {
    public int year;
    public int month;
    public int day;
    // 无参构造方法-内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
    // 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
    // 但是this(1900,1,1);必须是构造方法中第一条语句
    public Date(){
        //System.out.println(year);   注释取消掉,编译会失败
        this(1900, 1, 1);    
        //this.year = 1900;
        //this.month = 1;
        //this.day = 1;
    }
    // 带有三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}
 public static void main(String[] args) {
        Date date = new Date();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java反射机制来实现这个通用方法。具体实现如下: ```java import java.lang.reflect.Method; public class MethodCaller { public static Object callMethod(Object obj, String methodName, Object... args) throws Exception { Class<?>[] paramTypes = new Class[args.length]; for (int i = 0; i < args.length; i++) { paramTypes[i] = args[i].getClass(); } Method method = obj.getClass().getMethod(methodName, paramTypes); return method.invoke(obj, args); } } ``` 这个通用方法名为callMethod,接收三个参数:对象obj、方法名methodName和方法参数args。该方法的返回值类型为Object,因为它可以用来调用任意类的任意方法,所以返回值类型也需要是通用的。 在方法内部,首先通过args数组中每个参数的getClass()方法获取参数的类型,存储在paramTypes数组中。然后通过obj.getClass().getMethod(methodName, paramTypes)方法获取指定方法名和参数类型的Method对象。最后通过method.invoke(obj, args)方法调用该方法,并返回调用结果。 使用该方法的示例代码如下: ```java public class Test { public static void main(String[] args) throws Exception { String str = "hello"; String result = (String) MethodCaller.callMethod(str, "substring", 1, 3); System.out.println(result); // 输出 "el" } } ``` 在这个示例代码中,我们使用通用方法callMethod来调用String类的substring方法,并获取其返回值。因为我们在调用callMethod方法时传递了正确的参数,所以调用结果为"el"。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值