面向对象

面向对象

1.new对象的过程:

在这里插入图片描述

2.this关键字:当前对象

//访问当前对象的属性
this.属性名
//访问当前对象的方法
this.方法名
//构造函数之间互相调用,注意必须放在构造函数的第一行
this(...);
//返回当前对象
return this;
//this不能写在普通方法中,只能存在于构造函数中

3.构造函数(Constructor)

(构造器,构造方法)

作用:初始化对象

public class Product {
    private int proId;
    private String proName;
    private float proPrice;

    // 默认省略了 无参构造函数
    public Product(){
        System.out.println("Product的无参构造函数");
    }

}

/* =================================测试类 ================================= */

public static void main(String[] args) {
        new Product();  // 调用 Product的无参构造函数
}	

/*
	创建对象的步骤
	
	1. new 开辟堆内存
	2. 初始化对象的属性(构造函数)
	3. 执行构造函数的方法体

*/

注意:如果类中写了有参构造函数了,那么原先的无参构造函数会被覆盖,所以当写了有参构造函数时,要将无参构造函数也一起写出来。

4.方法重载(Overload)

同样的功能,要求参数列表不一样===方法重载overload
语法要求:
1.方法名相同
2.参数列表不一样
	(1)类型不一样;
	(2)个数不一样;
	(3)当参数列表数据类型不一致时,顺序不一样。

使用场合【重点】

同样的功能,已有的参数列表不满足需求,需要重新载入新的方法(方法名相同,参数列表不一样)
public int add(int a,int b){
        return 0;
    }

    public float add(float a,float b){
        return 0;
    }

    public int add(int a,int b ,int c){
        return 0;
    }

    public float add(int a,float b){
        return 0;
    }

    public float add(float a,int b){
        return 0;
    }

5.对象引用

Product p1 = new Product(1001,"枸杞",19.9f);
product p2 =p1;//p2的指针也指向p1的堆内存地址,此时p1和p2都指向同一块堆内存地址
p2.setPrice(21.9f);//此时p1和p2的price都改为了21.9
p2 = null;//指针断开,此时只有p1指向那一块堆内存


p2 = new Product(1002,"洗衣液",45.6f);
p2.setPrice(2.5f);//此时的p2和p1已经不再指向同一块堆内存了,所以p2的price属性修改不影响p1的price的属性值

6.例题

![值传递](C:\Users\Allen\Desktop\学习笔记\Java_Course\值传递.png)//创建Book类
public class Book {
    private String bookName;
    private float bookPrice;

    public Book(){}
    public Book(String bookName,float bookPrice){
        this.bookName = bookName;
        this.bookPrice = bookPrice;
    }
    //get,set方法省略

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public float getBookPrice() {
        return bookPrice;
    }

    public void setBookPrice(float bookPrice) {
        this.bookPrice = bookPrice; 
    }
}
//测试类
public class DataTransfer {
    public  static void main(String[] args){

        DataTransfer dt = new DataTransfer();
        int a = 10;
        int b = 20;
        dt.fun1(a,b);
        System.out.println("a = " + a + ", b = " + b);

        Book book = new Book("四大名著全套",199.9f);
        dt.fun2(book);
        System.out.println("书的名称:"+ book.getBookName() +  ", 书的价格:" + book.getBookPrice());
    }


    public void fun1(int x, int y){
        x = 30;
        y = 40;
    }

    public void fun2(Book book){
        book.setBookName("毛泽东选集");
        book.setBookPrice(99.9f);
    }
}
结果为a = 10,b = 20;
书的名称:毛泽东选集,书的价格:99.9

分析

在这里插入图片描述
在这里插入图片描述

7.父类转换为子类

(1)父类引用子类对象
 父类类型 = 子类对象//(子类对象可以直接转换为父类类型)
     例如:
     Pet pet = new Dog();
	Object object = new Dog();//父类引用子类对象
(2)父类 不可以 直接 转换为子类对象
例如:
Dog dog = (Dog)new Pet();//虽然IDEA检测正常,但是编译会出异常(ClassCastException:类型转换异常)
//分析:
new Pet(),在堆内存中开辟了一块Pet类型的,此时用Dog类型的dog变量来指向这块堆内存,显然无法接收,因为子类无法接收父类的对象。
在进行强制转换之前,需要进行判断是否为可以接收的类型(关键字:instanceof 判断是否为可接收的对象,返回布尔类型的值)
if(pet instanceof  Dog)
    Dog dog = (Dog)pet;

在堆内存中开辟了一块Pet类型的,此时用Dog类型的dog变量来指向这块堆内存,显然无法接收,因为子类无法接收父类的对象。




###### 在进行强制转换之前,需要进行判断是否为可以接收的类型(关键字:instanceof   判断是否为可接收的对象,返回布尔类型的值)
Pet pet  = new Dog();
if(pet instanceof  Dog)
    Dog dog = (Dog)pet;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值