Java基础25(类与对象)

面向对象

张老太养了两只猫:一只叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫。

使用现有技术解决:
1)单独的定义变量解决
2)使用数组解决

缺点:
不利于数据的管理
效率低


	   //单独变量来解决 => 不利于数据的管理 
		
        //第一只猫信息
		String cat1Name = "小白";
		int cat1Age=3;
		String cat1Color="白色";
		
        //第二只猫信息
		String cat2Name = "小花";
		int cat2Age=100;
		String cat2Color="花色";
		
		//使用数组解决 ==> (1)数据类型体现不出来
		//(2)只能通过[下标]获取信息,造成变量名字和内容的对应关系不明确
		//(3)不能体现猫的行为
		
		//第一只猫信息
		String [] cat1 = {"小白","3","白色"};
		//第二只猫信息
		String [] cat2 = {"小花","100","花色"};

用面向对象的方式来解决养猫问题:
主类

public static void main(String[] args) {
		//使用OOP面向对象解决
		//实例化一只猫[创建一只猫对象]
		
		//1.new Cat() 创建一只猫
		//2.Cat cat1 = new Cat(); 把创建的猫赋给cat1
		//3.cat1 就是一个对象
		Cat cat1 = new Cat();
		
		cat1.name =  "小白";
		cat1.age = 3;
		cat1.color = "白色";
		
		//创建了第二只猫 , 并赋给 cat2
		//cat2 也是一个对象(猫对象)
		Cat cat2= new Cat();
		cat2.name="小花";
		cat2.age= 100;
		cat2.color="花色";
		
		//怎么访问对象的属性?
		//第一只猫的信息
		System.out.println("第一只猫的信息"+cat1.name+" "+cat1.age+" "+cat1.color);

		//第二只猫的信息
		System.out.println("第一只猫的信息"+cat1.name+" "+cat1.age+" "+cat1.color);
	}

猫类

//定义一个猫类 Cat -> 自定义的数据类型
public class Cat {
	
	//属性
	String name;  //名字
	int age;   //年龄
	String color; //颜色

}

通过上面的案例:
1)类是抽象的,概念的,代表一类事物,比如人类,猫类,狗类等等,即它是数据类型。
2)对象是具体的,实际的,代表一个具体实物,即 是实例。
3)类是对象的模板,对象是类的一个个体,对应一个实例。

对象在内存中存在形式(重点)

在这里插入图片描述

属性/成员变量
1.从概念或叫法上看: 成员变量 = 属性 =field字段(即 成员变量是用来表示属性的)

2.属性是类的一个组成部分,一般是基本数据类型,也可是引用类型(对象,数组)。比如前面定义猫类的 int age 就是属性

class Car{
     String name; //属性,成员变量,字段 field
     double price;
     String color;
     String[] master; //属性可以是基本数据类型,也可以是引用类型(对象,数组)
}

注意事项:
1)属性的定义语法同变量

控制属性的访问范围:
有四种访问修饰符 public 、proctected 、默认、private

2)属性的定义类型可以为任意类型,包含基本类型或引用类型

3)属性如果不赋值,有默认值,规则和数组一致。

public static void main(String[] args){
    //创建Person对象
    //p1是对象名(对象引用)
    //new Person()创建的对象空间(数据)才是真正的对象
    Person p1=new Person();

    //对象的属性默认值,遵守数组规则:
    //int 0, short 0, byte 0, long 0
    //float 0.0, double 0.0, char \u0000,
    //boolean false, String null

}

Class Person{
  //四个属性
  int age;
  String name;
  double sal;
  boolean isPass;
}

在这里插入图片描述
cat只是对象名,也叫对象引用。

如何创建对象 :
1.先声明再创建
Cat cat; //声明对象 cat(相当于开辟空间,但是值为null)
cat = new Cat(); //创建(开辟另一个空间,返回给cat 一个地址值)

2.直接创建
Cat cat = new Cat();

类和对象的内存分配机制(重点)
看一个思考题
我们定义一个人类(Person)(包括,名字,年龄)

Person p1 = new Person();
p1.age=10;
p1.name="小明";
Person p2=p1; //把p1赋给了p2,让p2指向p1 
System.out.println(p2.age);

问: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,p就只向对象
4.进行指定初始化,比如p.name =“jack”; p.age =10;

练习题:分析画出内存布局图,进行分析

Person a = new Person();
a.age=10;
a.name="小明";
Person b;
b=a;
System.out.println(b,name);
b.age=200;
b=null;
System.out.println(a.age);
System.out.println(b.age);

当程序执行到 b=a 时
在这里插入图片描述

当程序执行到 b=null 时:
在这里插入图片描述

输出结果为:
小明
200
异常(空指针异常)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值