面向对象的概述
面向对象是一种符合人类思维习惯的编程思想。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。面向对象是把构成问题的事物按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合即可实现应用程序所需的功能。
面向对象的三个特点是:封装,继承,多态
-
封装
封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想
-
继承
继承主要描述的就是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行拓展。继承不仅增强了代码的复用性,提高了开发效率,还为程序的维护补充提供了便利。
-
多态
多态指的是在一个类中定义的属性和方法被其他类继承后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出多种不同的行为特性,不同的对象所表现出的行为是不一样的
值传递和引用传递
值传递
package com.wang.oop;
//值传递
public class Demo1 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);
System.out.println("=============");
//调用方法
change(a);
System.out.println(a);
}
//定义一个方法,返回值为空
public static void change(int a) {
a = 10;
}
}
引用传递
package com.wang.oop;
//引用传递:对象,本质还是值传递
public class Demo2 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);//null
System.out.println("===============");
change(person);
System.out.println(person.name);//哈哈
}
public static void change(Person person) {
person.name = "哈哈";
}
}
//定义了一个Person类,有一个属性:name
class Person {
String name;//null
}
类和对象
类
类是一种抽象的数据类型,它是对某一类事物整体描述,但不能代表某一个具体的事物。类是对某一类事物的抽象描述,而对象用于表示现实中该事物具体的个体,也就是实例化。
类是对象的抽象,他用于描述一组对象的共同特征和行为。以面向对象的编程思想,将某一类中共同的特征和行为封装起来,把共同特征作为类的属性(也叫成员变量),把共同行为称作类的方法(也叫成员方法)。
Java中的类是通过class关键字定义的:
修饰符 class 类名 {
//类体,包括类的成员变量和成员方法
}
修饰符可以是public,也可以不写(默认),类名首字母要大写,要符合命名规范。大括号{}的内容是类体,是需要在类中编写的内容,主要包括成员变量和成员方法。
类的成员变量(属性)的格式:
修饰符 数据类型 变量名;
类的成员变量也称作类的属性,用于描述对象的特征。修饰符为可选项,用于指定变量的访问权限其值可以是public,private。变量可以赋初始值,也可以不赋值。
对象
Java程序中可以使用 new 关键字来创建对象,格式:
类名 对象名 = new 类名();
Person person = new Person();
"new Person()"用于创建Person类的一个实例对象,"Person person"则是声明了一个Person类型的变量person,
中间的等号将 Person 对象在内存中的地址赋值给变量person,这样变量person就持有了对象的引用。在创建Person对象时,程序会占用两块内存区域,栈内存和堆内存。Person类型的变量person被存放在栈内存中,它是一个引用,会指向真正的对象;通过 new Person() 创建的对象则放在堆内存中,这才是真正的对象。可以通过"对象名.属性名"的方式来访问对象的属性或给属性赋值。
package com.wang.demo;
//主程序
public class Application {
public static void main(String[] args) {
/*
* 使用 new 关键字创建对象,也就是Student类的实例化
* */
Student stu1 = new Student();
Student stu2 = new Student();
/*
* 在没有对类中的属性赋值时,会有默认值
* */
System.out.println(stu1.name);//null
System.out.println(stu2.age);//0
System.out.println("==============");
//使用 "对象名.属性"的方式给属性赋值
stu1.name = "小明";
stu1.age = 10;
stu2.name = "小红";
stu2.age = 10;
System.out.println(stu1.name + stu1.age + "岁");
System.out.println(stu2.name + stu2.age + "岁");
//使用 "对象名.方法名"的方式调用类中的方法
stu1.study();
stu2.study();
}
}
=======================================================================
package com.wang.demo;
/**
* 定义一个Student类,
* 类中只允许有属性和方法
*/
public class Student {
//属性:也可以称为字段
String name;//null
int age;//0
//方法
public void study() {
System.out.println(name + "在学习!");
}
}
构造器
如果在实例化对象的同时就为这个对象的属性进行赋值,可以通过构造器实现。构造器,也叫构造方法,它在类实例化对象的时候被自动调用。
构造器的语法格式:
修饰符 方法名(参数列表) {
//方法体
}
定义构造器的时候要同时满足以下条件:
1.方法名必须与类名相同
2.在方法名的前面没有返回值类型的声明,void也不能写
3.在方法中不能使用return语句返回一个值,但是可以单独写return语句作为方法的结束
构造器的作用:
1.使用 new 关键字实例化(创建)对象
2.可以对属性进行初始化赋值
快捷键:Alt + Insert
在一个类中除了可以定义无参数的构造方法外,还可以定义有参数的构造方法,通过有参数的构造方法就可以实现对属性的赋值。在类中,程序会隐式的声明一个默认的无参构造方法,但是,若我们定义有参构造,那么无参构造就会被覆盖,我们必须要再显式的声明一个无参构造方法。
package com.wang.demo1;
//主方法
public class Application {
public static void main(String[] args) {
//使用 new 关键字实例化了一个对象
Person person = new Person("哈哈");
System.out.println(person.name);
}
}
=============================================
package com.wang.demo1;
public class Person {
//一个类中默认有一个隐式的无参构造
String name;
/*
无参构造方法
1.使用new关键字实例化对象
2.
*/
public Person() {
}
/*
* 有参构造
* 一旦定义了有参构造,无参构造就必须显式的定义
* */
public Person(String name) {
this.name = name;
}
}
构造方法的重载
与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法,来为不同的属性进行赋值。