1.面向对象编程
1.1 类与对象
1.类与对象的概念
*对象[属性]/[行为]
*语法
class cat
{
String name;
int age;
}
main()
{
//cat1就是一个对象
//创建一只猫
Cat cat1 = new Cat();
//给猫的属性赋值
cat1.name = "123";
cat1.age = 10;
}
*类是抽象的,概念的,代表一类事物,比如人类,猫类…即它是数据类型
*对象是具体的,实际的,代表一个具体事物,即是实例
*类是对象的模板,对象是类的一个个体
2.类与对象在内存中的存在形式
3.属性概念
*成员变量 = 属性 = field(字段)
*属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型(对象,数组)
4.属性注意事项和细节
1.属性的定义语法同变量
eg:访问修饰符 属性类型 属性名;
*访问修饰符:控制属性的访问范围
public,protected,默认,private
2.属性的定义类型可以为任意类型,包含基本类型或引用类型
3.属性如果不赋值,有默认值,规则和数组一致
Person p1 = new Person();
//p1是对象名(对象引用)
//new Person() 创建的对象空间(数据)才是真正的对象
5.如何创建对象
1.先声明再创建
Cat cat; //声明对象cat
cat = new Cat(); //创建
2.直接创建
Cat cat = new Cat();
6.如何访问属性
*语法:
对象名.属性名;
eg:
cat.name;
cat.age;
7.类与对象的内存分配机制
*类与对象赋值直接赋值地址
8.Java内存的结构分析
1.栈:一般存放基本数据类型(局部变量)
2.堆:存放对象(Cat cat ,数组等)
3.方法区:常量池(常量,比如字符串),类加载信息
1.2 成员方法
*在某些情况下,我们需要定义成员方法(简称方法),比如人类,除了有一些属性外(年龄,姓名…),还有一些行为比如:说话,跑步…
class Person
{
String name;
int age;
//添加speak成员方法
//1.public 表示方法是公开
//2.void 表示方法没有返回值
//3.speak() speak是方法名,()形参列表
//4.{}方法体,可以写我们要执行的代码
public void speak()
{
System.out.println("我是一个好人");
}
//(int n)形参列表
public void cal02(int n)
{
int res =0;
for(int i =1;i<=n;i++)
{
res += i;
}
System.out.println("cal02计算结果为:" + res);
}
}
main()
{
Person p1 = new Person();
p1.speak(); //调用方法
}
1.方法的调用机制
2.成员方法的好处
*提高代码的复用性(可以不用重复写方法)
*可以将实现的细节封装起来,然后供其他用户来调用即可
3.成员方法的定义
*语法:
public(访问修饰符 ) 返回数据类型 方法名 (形参列表)
{
方法语句;
return 返回值;
}
1.形参列表:表示成员方法输入cal(int n),getSum(int num1, int num2)
2.返回数据类型:表示成员方法输出,如果为void,表示没有返回值
3.方法主体:表示为了实现某一功能代码块
4.return语句不是必须的
4.成员方法的注意事项和细节
*访问修饰符
(作用是控制 方法使用的范围)
如果不写默认访问,[有四种:public, protected,默认, private]
*返回类型
1.一个方法最多有一个返回值(可以返回数组得到多个值)
class AA
{
public int[] getSumAndSub(int n1, int n2)
{
int[] resArr = new int[2];
resArr[0] = n1 + n2;
resArr[1] = n1 - n2;
return resArr;
}
}
2.返回类型可以为任意类型,包含基本类型和引用类型(数组,对象)
3.如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return 值,而且要求返回值类型必须和return的值类型一致或者兼容
4.如果返回值为void,则方法中可以没有return,或者只写return
*形参列表
1.一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1, int n2);
2.参数类型可以为任意类型,包含基本类型或引用类型,比如printArr(int[] map);
3.调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
4.实参和形参的类型要一致或兼容、个数、顺序必须一致
*方法体
*里面写完成功能的具体语句,方法之中不能再定义方法。
class AA
{
public void f4()
{
//public void f5(){}; //错误写法
}
}
*方法调用细节
1.同一个类中的方法调用:直接调用即可
class A{
public void print(intn)
{
System.out.println("方法调用 n="+ n);
}
public void sayOk()
{
//Sayok调用print
print(10);
}
}
2.跨类中的方法A类调用B类方法:需要通过对象名调用,比如对象名.方法名(参数); //在A类中创建B类,再调用方法
class A{
public void print(intn)
{
System.out.println("方法调用 n="+ n);
}
public void sayOk()
{
//Sayok调用print
print(10);
}
public void m1()
{
//创建B对象
B b = new B();
b.hi();
}
}
class B{
public void hi()
{
System.out.println("B类中的hi()被执行");
}
}
3.跨类的方法调用和方法的访问修饰符相关
*方法传参的机制
1.基本数据类型,传递的是值拷贝,形参的任何改变不影响实参
2.引用数据类型的传参机制,适用于数组和自定义数据类型。
*引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参
class B{
public void test100(int[] arr)
{
arr[0] = 200; //修改元素
//遍历数组
System.out.println("test100的数组arr");
for(int i =0;i<arr.length;i++)
{
System.out.print(arr[i]+"\t");
}
}
public void test200(Person p)
{
p.age = 10000;
}
}
class Person
{
String name;
int age;
}
main()
{
B b = new B();
int[] arr = {1,2,3};
b.test100(arr);//调用方法
System.out.println("main的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); //传的是p的地址
System.out.println(p.age);
}
class B{
public void test200(Person p)
{
p = null; //只是把形参p的名字指向了null,不影响实参p,因此外面输出的还是10
}
}
class Person
{
String name;
int age;
}
main()
{
B b = new B();
Person p = new Person();
p.name = "jack";
p.age = 10;
b.test200(p); //传的是p的地址
System.out.println(p.age);
}