类与对象


类与对象

看一个养猫猫的问题

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

使用现有技术解决

  1. 单独的定义变量解决
  2. 使用数组解决

现有技术解决缺点分析

不利于数据管理
效率低 ===》 引出类与对象
java设计者引入类与对象(OOP),根本原因就是现有的技术,不能完美解决新的需求

public class Object01 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//第一只猫的信息
		String cat1Name="小白";
		int cat1Age =3;
		String cat1Color ="白色";
		//第二只猫的信息
		String cat2Name ="小花";
		int cat2Age=100;
		String cat2Color="花色";
		//用数组来表示	
		String[] cat1= {"小白","3","白色"};
		String[] cat2= {"小花","100","花色"};
    }    
}

一个程序就是一个世界,有很多世界

  • 对象
    • 属性
    • 行为

类与对象的关系示意图

快速入门

用面向对象的方式解决养猫问题

public class Object01 {
public static void main(String[] args) {
		//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("第二只猫的信息"+cat2.name+" "+cat2.age+" "+cat2.color);
		}
	}
	//定义一个猫类Cat->自定义的数据类型
class Cat{
	//属性
	String name;//名字
	int age;//年龄
	String color;//颜色
	
	}

类与对象之间的区别和联系

通过上面的案例和讲解我们可以看出:

  1. 类是抽象的,概念的,代表一类事物,比如人类,猫类,…,即它是数据类型
  2. 对象是具体的,实际的,代表一个具体事物,即是实例
  3. 类是对象的模板,对象是类的一个个体,对应一个实例

对象在内存中的存在形式(重要)

属性/成员变量/变量

  • 基本介绍
  1. 从概念和叫法上看:成员变量=属性=field(字段)(即成员变量是用来表示属性的)
    案例演示:Car(name,price,color)
    public class Object02 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    	}
    
    }
    class Car{
    	String name;//属性,成员变量,字段field
    	double peice;
    	String color;
    	String[] master;//属性可以是基本数据类型,也可以是引用数据类型(对象,数组)。
    	
    }
  2. 属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型(对象,数组).比如前面定义猫类的int age就是属性
  • 注意事项和细节说明
  1. 属性的定义语法同变量,示例:访问修饰符 属性类型 属性名
  2. 属性的定义类型可以为任意类型,包含基本类型或引用类型
  3. 属性如果不赋值,有默认值,规则和数组一致。具体说:int 0, short 0, byte 0, long 0, float 0.0, double 0.0,char \u0000, boolean false, String null
  • 案例演示:[Person类]
    public class PropertiesDetail {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		//p1 是对象名(对象引用)
    		//newPerson()创建的对象空间(数据)才是真正的对象
    		Person0 p1=new Person0();
    		//对象得属性默认值,遵守数组规则:
    		//属性如果不赋值,有默认值
    		//int 0,short 0,byte 0,long 0,float 0.0,double 0.0,char \u0000,boolean
            System.out.println("\n当前这个人的信息");
            System.out.println("age="+p1.age+"name="
            		+p1.name+"sal="+p1.sal+"isPass"+p1.isPass);
    	}
    
    }
    class Person0{
    	int age;
    	String name;
    	double sal;
    	boolean isPass;
    	
    }

如何创建对象

  1. 先声明再创建
    Cat cat;//声明对象cat
    cat = new Cat();
  2. 直接创建
    Cat cat = new Cat();

如何访问属性

  • 基本语法
    对象.属性名
  • 案例演示赋值与输出
    cat.name;
    cat.age;
    cat.color;
  • 类和对象的内存分配机制
    看一个思考题
    定义一个人类(Person)包括(名字,年龄)
    public class Object03 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub	
    		Person p1=new Person();
    		p1.age=10;
    		p1.name="小明";
    		Person p2=p1;//p1赋值给了p2
    		System.out.println(p2.age);
        }
    }
    class Person {
    	int age;
    	String name;
    
    }

p2.age究竟是多少?

类和对象的内存分配机制

  • Java内存的结构分析
  1. 栈:一般存放基本数据类型(局部变量)
  2. 堆:存放对象(Cat cat ,数组等)
  3. 方法区:常量池(常量,比如字符串),类加载信息
  • 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);//出现异常


文章作者: Chtholly2333
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chtholly2333 !
  目录