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),则将数据放在方法区的常量池空间中;若对象属性是基本类型,则直接存放值。

将一个对象名赋值给另一个对象名,本质上是让这两个对象指向同一块内存,这点跟数组很像。

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;
}
}


(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;
}
}


课堂练习:
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;
}
}

被折叠的 条评论
为什么被折叠?



