全员关系总图:
1、类:是抽象的、概念的,代表一类事物,比如人类,狗类……即它是数据类型
(1)如何创建对象:
a)先声明后创建:
Cat cat;
cat=new Cat();
b)直接创建
Cat cat=new Cat();
2、对象:对象是具体的、实际的,代表具体事物,即是实例
▲类和对象的内在分配机制:
(1)基本结构:
(2)例题分析:
(3)具体实现流程:
①先加载Person类信息(属性和方法信息,只会加载一次)
②在堆中分配空间,进行默认初始化(看规则)
③把地址赋给a,a就指向对象
④进行指定初始化,比如a.name="小明",a.age=10
3、属性(成员变量/field(字段)):一般是数据类型,或引用类型(对象、数组)
(1)属性的定义:
a)属性的定义语法同变量(四种访问修饰符:public,proctected,默认,private)
b)属性的定义类型可以为任意类型,包含基本类型或引用类型
c)属性如果不赋值,有默认值,规则和数组一致
(2)如何访问属性:对象名.属性名
cat.name;
cat.age;
4、成员方法
(1)快速入门
//目的:创建不同功能的成员方法
package Project0101;
public class Method01 {
public static void main(String[] args) {
//方法使用
//1、方法写好后,如果不去调用,就不会输出
Person p1=new Person();//创建对象
p1.speak();//调用成员方法,输出一句话
p1.cal01();//调用cal01成员方法,计算从1+……+n的结果
p1.cal02(5);//调用cal02成员方法接收一个数n,计算从1+……+n的结果,同时n=5
//调用getSum成员方法,计算两个数的和
//把方法getSum返回的值,赋给变量returnRes
int returnRes=p1.getSum(10,20);
System.out.println("getSum方法返回的值="+returnRes);
}
}
class Person{
String name;
int age;
//方法(成员方法)
//添加speak成员方法,输出“我是好人”
//1、public:表示方法是公开
//2、void:表示方法没有返回值
//3、speak():speak是方法名,()形参列表
//4、{}方法体,可以写我们要执行的代码
//5、System.out.println("我是好人");表示输出
public void speak(){
System.out.println("我是好人");
}
//cal01方法:计算1+……100的结果
public void cal01(){
int res=0;
for(int i=1;i<=100;i++){
res+=i;
}//累加到n
System.out.println("计算结果="+res);
}
//cal02方法:接收一个数n,计算1+……100的结果
//(int n)形参列表,表示当前有一个形参n,可以接收用户输入
public void cal02(int n){
int res=0;
for(int i=1;i<=n;i++){
res+=i;
}
System.out.println("计算结果="+res);
}
//getSum方法:计算两个数之和
public int getSum(int num1,int num2){
int res=num1+num2;
return res;
}
}
(2)成员方法的定义:
访问修饰符 返回数据类型 方法名(形参列表……){
//方法体(完成具体功能的代码块)
语句;
return 返回值;
}
//访问修饰符(控制方法使用的范围,有四种):public,protected,默认(就是空着不写),private
//返回数据类型:
1、一个方法最多有一个返回值
2、返回类型可以为任意类型,包括基本类型和引用类型(数组,对象)
3、返回值类型必须和return的值类型一致或兼容
4、如果方法是void,则方法体中可以没有return语句,或者只写return
//方法名:
1、驼峰命名法,除了第一个单词的首字母小写外其余单词的首字母都大写
2、见名知意
//形参列表:
1、0个参数或多个参数,中间用逗号隔开
2、参数类型可以为任意类型
3、方法定义时的参数称为形式参数,简称形参;方法调用时的参数称为实际参数,简称实参,实参和形参的类型要一致或兼容、个数、顺序必须一致
//方法体:
1、方法不能嵌套定义
//方法调用:
1、同一个类中的方法调用:直接调用——》方法名(参数);
2、跨类中的方法A类调用B类方法(注意访问修饰符):需要通过对象名调用——》对象名.方法名(参数);
(3)成员方法调用机制
(4)成员方法传参机制:
package Project0101;
public class MethodParameter02 {
public static void main(String[] args) {
E b=new E();
int[] arr={1,2,3};
b.test100(arr);
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;
b.test200(p);
System.out.println(p.age);
}
}
class Person_{
String name;
int age;
}
class E{
public void test200(Person_ p){
p.age=1000;//测试题1:修改对象属性,结果从10改变为1000
}
/*
测试题2:结果是10
public void test200(Person_ p){
p=null;
}
*/
/*
测试题3:结果还是10
public void test200(Person_ p){
p=new Person();
p.name="tom";
p.age=99;
}
*/
public void test100(int[] arr){
arr[0]=200;//测试题4:改变方法里接收的数组,结果也改变
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
}
//测试题1和4结果改变的本质:main和方法都在栈区,都指向堆里同一个分区,只要其中一个人改变了分区里的东西,其余的人只能从分区里拿到改变后的东西
//测试题2结果不变的本质:方法里的p指向null,而不指向堆里的分区了,自然就不改变里面的东西
//测试题3结果不变的本质:方法里的p在堆里开辟了新的分区,然后返回main
// 此时main里的老p仍然指向老分区,但是main输出用的是老p
}
//划重点:
//1、基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参
//2、引用类型传递的是地址(传递的也是值,但是值是地址),可以通过形参影响实参
(5)成员方法的优点:
a)提高代码的复用性
b)可以将实现的细节封装起来,然后供其他用户来调用
5、克隆对象的例题:
//目的:(1)编写一个打印二维数组的数据的方法(2)编写一个方法,功能:复制一个对象,返回复制的对象(两个是独立的对象,只是属性相同)
package Project0101;
public class MethodExercise03 {
public static void main(String[] args) {
Person03 p=new Person03();
p.name="milan";
p.age=100;
MyTools03 tools=new MyTools03();
Person03 p2=tools.copyPerson(p);
//测试p和p2的属性是否相同
System.out.println("p的属性age="+p.age+"名字="+p.name);
System.out.println("p2的属性age="+p2.age+"名字="+p2.name);
//测试p和p2是否为同一个对象
System.out.println(p==p);//输出为true
System.out.println(p==p2);//输出为false
}
}
class Person03{
String name;
int age;
}
class MyTools03{
//编写方法的思路
//1、方法的返回类型Person
//2、方法的名字copyPerson
//3、方法的形参(Person03 p)
//4、方法体,创建一个新对象,并复制属性,返回即可
public Person03 copyPerson(Person03 p){
//创建一个新的对象
Person03 p2=new Person03();
//复制属性
p2.name=p.name;
p2.age=p.age;
return p2;
}
}
注:在B站上听韩顺平老师的课整理的笔记
本文含有隐藏内容,请 开通VIP 后查看