面向对象编程
Java设计者引入类与对象(OOP),根本原因就是现有的技术,不能完美的解决新的需求。
对象主要是由属性和行为构成的。
类就是数据类型(比如Cat),对象就是具体的实例。
//定义一个猫类Cat --> 自定义的数据类型
Class Cat{
//属性
String name;
int age;
String color;
}
//使用OOP面向对象解决
//实例化一只猫
Cat cat1 = new Cat();
cat1.name = ""
cat1.age = 3
cat1.color = "白色"
System.out.println("第1只猫信息"+cat1.name+" "+cat1.age+" " +cat1.color);
1)类是抽象的,概念的,代表一类事物。即它是数据类型。
2)对象是具体的,实际的,代表一个具体事物,即是实例。
3)类是对象的模板,对象是类的一个个体,对应一个实例。
对象在内存中存在形式
创建Person对象 Person p1 = new Person();
p1是对象名(对象引用)new Person()创建的对象空间(数据)才是真正的对象
创建对象的两种方式
1.先声明再创建 Cat cat; cat = new Cat();
2.直接创建 Cat cat = new Cat();
访问属性:对象名.属性名
对象分配机制
Person p2=p1;//把p1赋给了p2,让p2指向p1
成员方法
Class Person{
String name;;
int age;
public void speak(){
System.out.println(""):
}
//(int n)形参列表,表示当前有一个形参,可以接受用户输入
public void cal02(int n){
}
public int getSum(int num1,num2){
int res = num1 + num2;
return res;
}
}
//方法使用(调用)
Person p1 = new Person();
p1.speak();
p1.cal02(5);
int returnRes = p1.getSum(10,20);
方法调用机制
成员方法的好处
- 提高代码的复用性
- 可以将实现的细节封装起来,然后供其他用户来调用即可
成员方法的定义
成员方法注意细节
方法的传参机制
主栈和swap栈是独立的数据空间,基本数据类型不是引用,一个变化不会影响另一个。
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
方法递归调用
简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂问题,同时可以让代码变得简洁。
老鼠出迷宫
扩展思考:如何求出最短路径?(1)穷举 (2)图–>求出最短路径
汉诺塔
八皇后
不会不会不会 太难了!!!
八皇后
方法重载
在Java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致!
重载的好处:减轻了起名和记名的麻烦
注意事项和使用细节
- 方法名 必须相同
- 参数列表 必须不同(参数类型或个数或顺序,至少有一样不同,参数名无要求)
- 返回类型 无要求
可变参数
Java中允许将同一个类中多个同名同功能但是参数个数不同的方法,封装成一个方法。就可以通过可变参数实现。
基本语法
访问修饰符 返回类型 方法名(数据类型...形参名){
}
//1. int... 表示接受的是可变参数,类型是int,即可以接收多个int(0-多)
//2. 使用可变参数时,可以当作数组来使用,即nums可以当作数组
public int sum(int... nums){
}
pubic String calculate(String name, double… scores){
sum = 0;
for(int i=0;i<scores.length;i++){sum+=scores[i];}
}
作用域
- 在Java编程中,主要的变量就是属性(成员变量)和举报变量
- 局部变量一般是指在成员方法中定义的量。
- java中作用域的分类:全局变量 也就是属性,作用域为整个类体。局部变量 除了属性之外的其他变量,作用域为定义它的代码块中
- 全局变量(属性)可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,因为没有默认值。
注意事项和使用细节
- 属性和局部变量可以重名,访问时遵循就近原则。
- 在同一个成员方法中,两个局部变量不能重名。
- 属性生命周期较长,伴随对象的创建而创建,对象的销毁而销毁。局部变量,生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁,即在一次方法调用过程中。
- 作用范围不同 全局变量/属性 可以被本类使用,或其他类使用(通过对象调用)局部变量 只能在本类中对应的方法中使用
- 修饰符不同 全局变量/属性可以加修饰符 局部变量不可以加修饰符
构造方法/构造器
构造方法也叫构造器,是类的一种特殊方法,它的主要作用是完整对新对象的初始化。
它有几个特点(1)方法名和类名相同 (2)没有返回值 (3)在创建对象时,系统会自动调用该类的构造器完成对象的初始化。
Class Person{
String name;
int age;
}
// 构造器没有返回值,也不能写void 构造器的名称和类名一样 (String pName, int pAge)构造器形参列表,规则和成员方法一样
pulic Person(String pName, int pAge){
name = pName;
age = PAge;
}
Person p1 = new Person("Smith",80)
注意事项和使用细节
- 一个类可以定义多个不同的构造器,即构造器重载
- 构造器名和类名相同
- 构造器没有返回值
- 构造器是完成对方法的初始化,并不是创建对象
- 在创建对象时,系统自动的调用该类的构造方法
- 如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器)【可以使用javap指令反编译】
- 一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下,即Person(){}
对象创建的流程分析(啊啊啊啊希望我可以用文字描述出来!
- 加载Person类信息(Person.class),只会加载一次
- 在堆中分配空间(地址)
- 完成对象初始化【3.1 默认初始化age=0 name=null 3.2 显式初始化age=90 name = null 3.3 构造器初始化age = 20 name=小倩】
- 在对象在堆中的地址,返回给p(p是对象名,也可以是理解成对象的引用)
背下来!!!背下来!!!背下来!!!
this关键字
Java虚拟机会给每个对象分配this,代表当前对象。
class Dog{
String name;
int age;
public Dog(String name, int age){
//this.name,this.age就是当前对象的属性name和age
this.name = name;
this.age = age;
}
}
this是个隐藏的属性,它指向它自己的对象。
可以利用hashCode()来看对象的情况。
简单地说,那个对象调用,this就代表哪个对象。
this的注意事项和注意细节
- this关键字可以用来访问本类的属性、方法、构造器
- this用于区分当前类的属性和局部变量
- 访问成员方法的语法:this.方法名(参数列表)
- 访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中访问另外一个构造器,必须放在第一条语句)
class T{
/*
细节,访问构造器语法:this(参数列表);
注意只能在构造器中使用(即只能在构造器中访问另外一个构造器)
注意:访问构造器语法: this(参数列表);必须防止在第一条语句。
*/
public T(){
System.out.println("T()构造器");
//这里去访问T(String name, int age)构造器
this("jack",100);
}
public T(String name, int age){
System.out.println("T(String name, int age)构造器");
}
}
- this不能在类定义的外部使用,只能在类定义的方法中使用