面向对象
面向对象编程特点:
稳定性、可扩展性、可重用性
重点:
继承、封装、多态
1 概念定义
对象: 实例
类: 确定对象将会拥有的特征(属性)和行为(方法)
关系: 对象是类的实例表现,类是对象的类型。在计算机中可以认为对象是特定类型的数据
属性: 对象具有的各种静态特征
方法: 对象具有的各种动态行为
2 类和对象的创建使用案例
对象的创建过程:
类->(实例化)->对象
Tips:包名的命名规范
1.英文字母小写
2.域名的倒序加相关内容的名称
应用案例:
- 类的创建(包括属性和方法)
package TestClass;
public class Cat {
//属性:昵称、年龄、体重、品种
String name;
int year;
double weight;
String species;
//方法:跑动、吃东西
public void run() {
System.out.println("run");
}
public void eat() {
System.out.println("eat");
}
public void run(String x) {
System.out.println(x+"running");
}
}
- 对象实例化
定义类,实例化对象,通过对象来进行操作
package TestClass;
public class CatTest {
public static void main(String[] args) {
//对象实例化
Cat one=new Cat();
//测试
one.eat();
one.run();
one.year=1;
System.out.println(one.year);
one.name="1号";
one.run(one.name);
}
}
Tips:单一职责原则(单一功能原则):
面向对象设计中的一个重要原则(一个类有且只有一个引起变化的原因)
3. 实例化对象的过程
-
对象实例化:
类名 对象名=new 类名 -
实例化对象的过程可以分为两部分:
- 声明对象
内存的栈中开辟一块空间 - 实例化对象
内存的堆中开辟一块空间
- 内存中的存储形式
-
Cat one=new Cat();
把堆空间开辟的内存地址存放到对象名中 -
Cat one=Cat();
Cat two=Cat();
开辟两个空间,不会相互影响 -
Cat one=Cat();
Cat two=one;
开辟了一个空间,实例在堆空间中的地址会复制一份一个,修改其中一个会影响另一个
总结:
在栈中生成一个对象,在堆当中通过new关键字开辟了一个新的空间,通过赋值符号将堆空间中的内存地址存放到栈空间中的对象空间中,通过对象名去操作具体对象的具体信息。
4. 构造方法
4.1 作用
构造函数/构造器:
完成对象初始化的相关设置
4.2 注意事项
- 构造方法的方法名必须与类名相同且没有返回值
- 构造方法不能被对象单独调用
- 只能在对象实例化的时候调用
- 当没有指定构造方法时,系统会自动添加无参的构造方法
- 当有指定的构造方法,无论是有参、无参的构造方法,都不会自动添加无参的构造方法
- 一个类中可以有多个构造方法
4.3 语句格式
public 构造方法名(){
}
4.4 应用案例:
4.4.1 无参构造方法
//无参构造方法
public Cat() {
System.out.println("无参构造方法");
}
package TestClass;
public class CatTest {
public static void main(String[] args) {
//对象实例化
Cat one=new Cat();
//测试
one.eat();
one.run();
}
}
注意:
在进行对象实例化时,会去调用它对应的构造方法,完成构造方法里面的操作,调用完成后回到实例化语句。
4.4.2 带参构造方法:
public Cat(String name,int year,double weight,String species) {
//System.out.println("无参构造方法");
name=name;
year=year;
weight=weight;
species=species;
}
Cat one=new Cat("miao",1,1.2,"田园猫");
Tips:没有给属性赋值,则输出结果为null、0、0.0、null
**Error:**程序的逻辑有问题:
带参构造方法传入参数没有赋值给属性,就近原则,优先寻找最近的同名参数进行赋值。
**解决方案1:**改变传递的参数名
public Cat(String nname,int nyear,double nweight,String nspecies) {
//System.out.println("无参构造方法");
name=nname;
year=nyear;
weight=nweight;
species=nspecies;
}
解决方案2: this关键字
- this代表当前对象,告诉传入的参数要赋值给对象的属性
- 调用成员属性,解决成员属性和局部变量同名冲突
- 调用成员方法
- 调用重载的构造方法:通过this()调用构造方法,必须放在方法体第一行
public Cat(String name,int year,double weight,String species) {
this.name=name;
this.year=year;
this.weight=weight;
this.species=species;
注意: 构造方法在类内是不能被普通的成员方法调用的
同一个类的构造方法之间可以通过this();的方法调用
5 总结
定义类
public class 类名{
//定义属性部分
[访问修饰符]数据类型 属性名;
//定义方法
[访问修饰符]返回类型 方法名;
}
创建并引用对象
类名 对象名=new 构造方法();
对象名.属性
对象名.方法名()