lesson7 - Java类与对象(基础篇)

1 类与对象的定义

  1. 类的定义。类是对某一种具有共同特征的事物的描述。就如现实世界是由一个个事物组成一样,一个计算机程序也可由一个个的类组成。类是一种用户自定义的数据类型(引用类型),有属性和方法这两个关键元素。例如设计一个类Dog,其属性有breed, name, size, color, age… 其行为有eat, sleep, run, cry…
在这里插入图片描述
   2. 对象的定义。对象是类的一种实例化,这就像一个物种下会有许多个体一样(大熊猫圆圆、毛豆、蓉宝、芝士…)。下图是对象的一个演示,Dog类下面对应的对象有Dog1, Dog2, Dog3…
在这里插入图片描述
类比前面学过的基础数据类型,下面这句话中,int\boolean都是一个类,a是int类的一个对象,b是boolean类的一个对象。

int a = 5;
boolean b = true;

  3. 对象在jvm中的内存分布。在栈中创建对象的一个引用(本质上是开辟一块内存空间,这个内存中存放指向堆对象的指针),随后在堆中实际建立这个对象,对象属性若是引用类型(例如下图中的cat.name, cat.color),则将数据放在方法区的常量池空间中;若对象属性是基本类型,则直接存放值。
对象在jvm中的内存分布
将一个对象名赋值给另一个对象名,本质上是让这两个对象指向同一块内存,这点跟数组很像。
在这里插入图片描述

2 类与对象的创建

  1. 类与对象的使用步骤。第一步,定义一个类;第二步,在main()方法中用new创建类对象;第三步,调用类对象中相应的属性和方法
  2. 类的创建方式。定义类的名称,然后在类的函数体中定义成员变量和成员方法。例如下图中创建了一个名为Person的类,类中包含成员变量age, name, sal, isPass,包含成员方法speak, Caculate_sum, getSum

class Person{
	int age;
	String name;
	double sa1;
	boolean isPass;
	// 方法功能:输出"我是一个好人"
	public void speak(){    
		System.out.println("我是一个好人!");
	}
	// 方法功能:计算1到n的和
	public void Caculate_sum(int n){
		int sum = 0;
		for(int i = 1; i <= n ; i++){
			sum = sum + i;
		}
		System.out.println("sum= " + sum);
	}
	// 方法功能:计算数字n1与数字n2的和
	public int getSum(int num1, int num2){
		int sum ;
		sum = num1 + num2;
		return sum;
	}

}

  3. 对象的创建方式。有两种创建方式,一是先声明再创建,二是直接创建,这与前面基本数据类型的定义很像。

class Class_test{
	public static void main(String[] args){
	// 对象的创建方式1: 直接创建
	// p1对象名,本质上是对象的一个引用,存放在栈中
	// new Person()开辟空间创建真正的对象,存放在堆中
		Person p1 = new Person();
		System.out.println("age= " + p1.age);
	// 对象的创建方式2: 先声明再创建
		Person p2;
		p2 = new Person();	
	}
}
class Person{
	int age;
	String name;
   }

3 类属性细节

3.1 定义格式

  叫法上,属性=成员变量=field;
  定义属性的语法形式为: 访问修饰符 属性类型 属性名
访问修饰符控制属性的访问范围,有四种访问修饰符public, protected, private和默认。属性类型既可以是基本类型,也可以是引用类型;

3.2 调用格式

调用属性的语法形式为: 对象名.属性名
属性不赋值时,其有默认值,规则与数组中一致。

class Class_test{
	public static void main(String[] args){
	// 属性的使用
		Cat cat1 = new Cat();
		cat1.age = 10 ;
        cat1.name = "小花";
        cat1.color = "黑白相间";
        System.out.println("age= " + cat1.age +"name= " + cat1.name + "color= " + cat1.color);	
	}
}
class Cat{
	String name;
	int age;
	String color;
}

4 类方法细节

  类方法的意义主要体现在2个方面,一是可以极大提高代码复用性,每次执行同一段功能的代码时无需再粘贴复制占用空间;二是可以将实现的细节封装起来,供其他用户调用方便,提高并行开发速率。

4.1 定义格式

  叫法上,类方法=成员方法=函数
  定义方法的格式为:访问修饰符 返回值类型 方法名 (形参列表) {
                                方法体
                                return 返回值
                              }
  其中,修饰符类型有四种(public protected private 默认);返回值类型既可以是基本类型也可以是引用类型,一个方法最多只能有一个返回值。如果方法有返回值,则在函数体的最后必须return返回值,retrurn的类型与返回值类型需保持一致,如果方法没有返回值,则无需写return语句且返回值类型写成void;方法名在定义时遵循驼峰命名法,即见名知义;形参列表中可以无参数也可以有多个参数,不同的形参之间用逗号隔开,每个形参的类型可以为基本类型或引用类型,调用方法时形参列表与实参列表的个数、数据类型都需要保持一致;方法体中写完成具体功能的语句,例如运算、输入输出、分支、循环、方法调用等,但其中一定不能再定义新的方法

4.2 调用格式

调用方法的格式为: 对象名. 方法名(实参列表)

class Class_test{
	public static void main(String[] args){
    // 方法的使用
        Person p3 = new Person();
        p3.speak();                 		// 调用方法speak后,输出"我是一个好人"
		p3.Caculate_sum(100);               // 调用方法Caculate_sum后,计算1到100的和 
		int n = p3.getSum(1,1);             // 调用方法getSum后,计算1+1的值
		System.out.println(n);
	}
}
class Person{
	int age;
	String name;
	double sa1;
	boolean isPass;
	// 方法功能:输出"我是一个好人"
	public void speak(){    
		System.out.println("我是一个好人!");
	}
	// 方法功能:计算1到n的和
	public void Caculate_sum(int n){
		int sum = 0;
		for(int i = 1; i <= n ; i++){
			sum = sum + i;
		}
		System.out.println("sum= " + sum);
	}
	// 方法功能:计算数字n1与数字n2的和
	public int getSum(int num1, int num2){
		int sum ;
		sum = num1 + num2;
		return sum;
	}
}

其中,若是进行同一个类中的方法调用时,直接调用即可;若是进行 跨类的方法调用,则需要通过对象名调用(此外,能否成功进行跨类方法的调用还与方法的访问修饰符类型有关)

class Class_test{
	public static void main(String[] args){
		A a1 = new A();
		a1.sayOk();
	}
}
class A{

	public void Print(int n){
		System.out.println("输出一个数:" + n);
	}
	public void sayOk(){
		Print(10);      // 同一个类中进行方法调用时,直接调用即可
		B b1 = new B();
		b1.PPrint(10);  // 跨类方法进行调用时,需要先创建类对象,然后通过对象名调用
	}

}
class B{
	public void PPrint(int n){
		System.out.println("输出一个数:" + n);
	}
}

4.3 内存分布

  类方法在jvm中的内存分布。当程序执行到方法时,就会在栈中开辟一个独立的栈空间;当方法执行完毕,就会返回到调用方法的地方,随后继续执行后面的代码
在这里插入图片描述

4.4 类方法的传参机制

  (1)类方法中的形参类型是基本数据类型时,传递的是值,形参的改变不会影响实参

 class Class_test{
	public static void main(String[] args){
	// 值传递验证
		int a = 10;
		int b = 20;

		CC c1 = new CC();
		System.out.println("进行交换前a=" + a + ";  b的值=" + b);
		c1.swap(a,b);
		System.out.println("进行交换后a=" + a + ";  b的值=" + b);
	}
}
 class CC{
	// 成员方法的参数为基本类型
	public void swap(int a, int b){
		int temp = a;
		a = b;
		b = temp;
	}
}

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

(值传递过程中jvm内存分布图)

  (2)类方法中的形参类型是引用数据类型时,传递的是地址,形参的改变会带着实参一起改变

 class Class_test{
	public static void main(String[] args){
	// 地址传递验证

		DD d1 = new DD();
        // 成员方法的参数为引用类型-数组
        
		int[] arr = {1,2,3};
		System.out.println("进行引用传递前的数组为:" );
		for(int i = 0 ; i < arr.length ; i++){
			System.out.print(arr[i]+"\t");
		}
		System.out.println();
		d1.Array_change(arr);
		System.out.println("进行引用传递后的数组变为:" );
		for(int i = 0 ; i < arr.length ; i++){
			System.out.print(arr[i]+"\t");
		}
		System.out.println();

		// 成员方法的参数为引用类型-类对象
		Person p = new Person();
		p.name = "jack";
		p.age = 10;
		System.out.println("进行引用传递前p.age = " + p.age);
		d1.Object_change1(p);
		System.out.println("进行引用传递1后p.age = " + p.age);
		d1.Object_change2(p);
		System.out.println("进行引用传递2后p.age = " + p.age);		

	}
}
class DD{  
    // 数组作为形参
	public void Array_change(int[] arr){
		arr[0] = 100;
	}
	// 类对象作为形参
	public void Object_change1(Person p){
		p.age = 10000;
	}
	public void Object_change2(Person p){
		p = null;
	}
}

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

(数组传递过程中jvm内存分布图)

课堂练习:

class Class_test{
	public static void main(String[] args){

	// 程序功能:在MyTools类中编写一个方法copyPerson,实现对象的克隆。
	//      	即可以复制一个Person对象,返回复制的对象。这个复制的对象和原来的对象不是同一个,只是属性相同
		MyTools t = new MyTools();

		Person p = new Person();
		p.name = "jack";
		p.age = 10;

		Person p2 = new Person();
		p2 = t.copyPerson(p);

		System.out.println("p.age = " + p.age + " p.name = " + p.name);
		System.out.println("p2.age = " + p2.age + " p2.name = " + p2.name);

	}
}


class Person{
	int age;
	String name;
}

class MyTools{

	public Person copyPerson(Person p){
		Person p2 = new Person();
		p2.age = p.age;
		p2.name = p.name;
		return p2;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值