Java 面向对象
面向对象
-
在实际开发当中,我们还需要存储其他的数据那么我们该怎么做呢?
-
我们学习编程语言,就是为了模拟现实世界的事物,实现信息化因此Java为我们提供了类。
-
现实生活中如何描述一个事物呢:
属性 该事物的特征描述
方法 该事物的动作行为
举例:表示一条狗
属性 狗的品种,狗的颜色,狗的体重
方法 跑,跳,叫,睡
我们学习的Java语言最基本单位是类,所以,使用类来描述事物。 -
类的定义
[访问权限修饰符] class 类名 {
属性/ 成员变量/ 字段
行为/ 成员方法
} -
类的理解:
1.类是用来描述现实事物的,是Java语言的最基本单位
2.类是抽象的,是由多个对象抽象想象的部分而来
3.类可以理解为一个模板,数属性和行为的集合,可以通过类的模板创建具体的对象
4.Java使用class来描述一个类 -
List item
5.类的本质用来组织代码(方法归类),封装数据的(理解提高成员变量的安全性)。
-
对象的理解:
1.对象是客观存在的,万事万物皆是对象
2.对象是在类的基础上创建的
3.对象又称为 实例/引用/变量/对象 -
创建一个对象
格式: 类名 对象名 = new 类名();
-
访问一个对象
访问成员
对象.成员变量
对象.成员方法 -
定义一个类的步骤
1、定义类名
2、编写类的属性
3、编写类的方法
4、创建对象
5、通过对象访问成员
public class OOPDemo01 {
public static void main(String[] args) {
Student xiaoLi = new Student();
System.out.println(xiaoLi.name);
System.out.println(xiaoLi.age);
System.out.println(xiaoLi.height);
System.out.println(xiaoLi.gender);
System.out.println(xiaoLi.isMarried);
xiaoLi.name = "小丽";
xiaoLi.age = 18;
xiaoLi.height = 1.8;
xiaoLi.gender = "男";
xiaoLi.isMarried = true;
System.out.println(xiaoLi.name);
System.out.println(xiaoLi.age);
System.out.println(xiaoLi.height);
System.out.println(xiaoLi.gender);
System.out.println(xiaoLi.isMarried);
int result = xiaoLi.add(10, 30);
System.out.println(result);
xiaoLi.print99MulTable();
xiaoLi.sleep();
Student s = null;
System.out.println(s.name);
}
}
class Student {
// 成员变量
// 姓名
String name;
// 年龄
int age;
// 身高
double height;
// 性别
String gender;
// 是否已婚
boolean isMarried;
// 成员方法 之前的static去掉,之前怎么写方法的,现在就怎么写!!
public int add(int a, int b) {
return a + b;
}
// 打印九九乘法表
public void print99MulTable() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "x" + i + "=" + (i*j) + "\t");
}
System.out.println();
}
}
public void sleep() {
System.out.println("睡");
}
}
成员变量和局部变量
1.定义的位置不同
成员变量: 类体以内,方法体以外
局部变量: 方法的声明上,或者方法体内
2.在内存的位置不一样
成员变量: 在堆区分配内存
局部变量: 在栈区分配内存
3.初始化值不一样
成员变量: 系统赋予初始值
byte short int long 0
float double 0.0
boolean false
char \u0000
引用类型 null
局部变量: 方法的声明上,或者方法体内
没有默认值,必须先声明再赋值再使用
4.变量的生命周期不一样
生命周期: 变量从开始创建到销毁的全过程
成员变量: 随着对象的创建而创建,随着垃圾回收器回收对象的时候销毁
局部变量: 随着方法的调用而创建,随着方法调用结束而销毁
5.当成员变量和局部变量重名的时候,局部变量优先,就近原则
如果希望访问成员变量,需要使用this关键字
匿名对象
概念: 没有名字的对象,本质还是一个对象
匿名对象的特点:
1.既然是对象,同样可以访问成员
2.匿名对象只能够使用一次,如果需要使用多次,必须使用变量接收
3.匿名对象一旦使用一次完毕,立刻成为垃圾对象,等待垃圾回收期在空闲的时候回收,节约内存资源
4.匿名对象在Java里一般用于访问一次的情况,简化代码,在Android里节约内存资源
public class OOPDemo04 {
@SuppressWarnings("resource")
public static void main(String[] args) {
Student s1 = new Student();
// new Student();
//
// System.out.println(new Student().name);
//
// new Student().print99MulTable();
new Student().name = "隔壁老王";
System.out.println(new Student().name); // null
String line = new Scanner(System.in).next();
System.out.println(line);
new Test().method(new Student());
}
}
class Test {
public void method(Student s) {
System.out.println(s.name);
}
}
垃圾对象
垃圾对象:没有地址引用的对象称为垃圾对象
什么情况下会成为垃圾对象?
1.当指向某个堆区的空间的对象被赋值为null
2.匿名对象第一次使用完毕
3.对象所在的方法调用完毕
4.对象被重新赋值新的地址
public class OOPDemo05 {
public static void main(String[] args) {
Student s1 = new Student();
// 1.当指向某个堆区的空间的对象被赋值为null
// s1 = null;
// 2.匿名对象第一次使用完毕
new Student().sleep();
// 3.对象所在的方法调用完毕
Demo d = new Demo();
d.method();
// 4.对象被重新赋值新的地址
s1 = new Student();
}
}
class Demo {
public void method() {
Student s = new Student();
}
}
封装
1.希望外界不能够直接访问类里的一些属性
2.希望外界传递给类的内部的数据能够得到数据校验,例如年龄必须在0~100岁之间
封装的概念
对数据进行访问权限控制,主要依赖的就是访问权限修饰符
访问权限修饰符: public protected [default] private
如何来对数据进行封装?
1.对需要封装的数据成员使用访问权限修饰符(private)加以修饰
2.在类的内部提供对外访问渠道 (set get方法)
3.使用代码对数据做数据校验 (一般省略不写,看需求实现)
类的组成:
class 类 {
成员变量
成员方法
普通方法
读写方法 (get/set方法)
}
一个JavaBean
bean domain pojo entity
public class PrivateDemo01 {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("小花");
s1.setAge(35);
s1.showStudentInfo();
Student s2 = new Student();
s2.setName("小李");
s2.setAge(25);
s2.showStudentInfo();
}
}
class Student {
private String name;
private int age;
private String gender;
// 在类体以内,方法体以外只能够定义成员,不能够触碰逻辑代码
// if(age < 0 || age > 100) {
// System.out.println("年龄不合法!!!");
// }
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void study() {
System.out.println("Student.study()");
// public int num;
}
public void showStudentInfo() {
System.out.println(getName() + "," + getAge());
}
// 读
/*
* 功能: 对外界提供年龄值
* 返回值类型: int
* 参数列表: 无参
* 方法名: getAge
*/
public int getAge() {
if (age >= 18) {
return 18;
} else {
return age;
}
}
// 写
/*
* 功能: 外界修改内部年龄的值
* 返回值类型: void
* 参数列表: int innerAge
* 方法名: setAge
*/
public void setAge(int outAge) {
if(outAge < 0 || outAge > 100) {
System.out.println("年龄不合法!!!");
} else {
age = outAge;
}
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
this关键字
当局部变量和成员变量重名的时候,可以考虑使用this来区分
this关键字
this代表当前对象,
this的特点:
1.成员变量和局部变量重名的时候使用this
2.创建任何一个对象都会创建一个this引用和对象指向同一个堆区的空间
3.this代表当前对象,谁调用了this就是指得谁
4.this只能够出现在类的内部
5.this的设计代表现实生活中代词的概念 (“我的”)
6.默认访问类的成员都可以使用this来访问,如果访问成员没有书写this,默认系统会加上this
构造方法
1.假设一个类中有100个属性,一个一个set很麻烦
构造方法: 构造方法本身就是一个特殊的方法而已
1.能够快速初始化成员变量的值
2.能够为对象分配内存空间 + new
构造方法的格式:
[访问权限修饰符] 方法名(参数列表) {
方法体;
return;
构造方法的特点:
1.构造方法没有返回值,连void都没有
2.构造方法也是方法,存在方法重载
3.构造方法是用来给成员快速初始化的
4.构造方法方法名必须和类名保持一致
构造方法的注意事项:
1.如果我们没有书写构造方法,系统会帮我们书写一个无参构造方法
2.如果你一旦书写了一个带参构造方法,就会覆盖系统的无参构造方法
3.养成一个好习惯: 每次书写一个bean的时候,都写上无参构造方法
好处:
1.无参构造方法能够初始化默认成员的值
2.反射中调用的就是无参构造方法,很多框架中都会利用反射技术创建对象,反射大部分都是依赖无参构造方法
类的组成
class 类 {
成员变量
构造方法
构造方法重载
成员方法
普通方法
读写方法 (get/set方法)
}
一个JavaBean
bean domain pojo entity
public class ConstructorDemo01 {
public static void main(String[] args) {
Student s = new Student();
s.setName("张三");
s.setAge(18);
s.show();
Student s2 = new Student("李四", 20, "男");
s2.show();
}
}
class Student {
private String name;
private int age;
private String gender;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public void show() {
System.out.println("Student [name=" + name + ", age=" + age + ", gender=" + gender + "]");
}
}