Java类和对象
面向对象概述
面向对象强调运用人类在日常的思维逻辑中采用的思想方法与原则。Java是基于面向对象的,关注的是一键事情拆分成不同的对象,考对象的交互完成。
面向对象的概念
面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。
面向对象注重的是对象,也就是参与过程所涉及到的主体。是通过逻辑将一个个功能实现连接起来
- 面向对象是思考问题的一种思考方式,是一种思想。比如:概念与实例。理论与实践。名和实等等;
- 类就是一类对象的统称。对象就是这一类具体化的一个实例;
面向对象的设计
1.经验:谁拥有数据,谁就对外提供操作这些数据的(私有)方法;
2.开发时,需要找对象、建对象、用对象并维护对象之间的关系;
面向对象的特点
1.将复杂的事情简单化;
2.面向对象将以前的过程中的执行者编程指挥者;
3.面向对象的优点是这种思想符合人类的思维习惯;
面向对象的基本特征
1.封装:保护对象内部的操作不被破坏;
2.继承:在父类的基础上继续进行扩充;
2.多态:某个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态;
类和对象
1.类(class)和对象(object)是Java语言的基本元素,是面向对象的核心概念;
2.类:类是对某一类事物的描述它是一个模板,描述了一类对象的行为;
3.对象:对象是实际存在的某类事物的具体个体,所以也被称为实例,它有具体的状态和行为。
简而言之,面向对象就是用代码(类)来描述客观世界的事物的一种方式。一个类主要包含一个事务的属性和行为;
类
举个简单的例子,我们做月饼的模子就是一个类,而通过这个模子可以做出月饼,那么在这个例子当中,类就是那个模子,而月饼就是那个对象,所以月饼就是一个实体,并且一个模子可以实例化无数个对象。即类相当于一个模板,对象是有模板产生的样本。一个类可以产生无数个对象;
创建类
1.声明一个类就是创建一个新的数据类型,而在 Java 中类属于引用类型, Java 使用关键字 class 来声明类。如下就创建了一个表示人的类:
// 创建类
class Person {
public int age;//成员属性 实例变量
public String name;
public String sex;
public void eat() {//成员方法
System.out.println("吃饭!");
}
public void sleep() {
System.out.println("睡觉!");
}
}
类的组成部分
类的组成部分包括:字段、方法、代码块、内部类以及接口等等;
1.
类的实例化
用类类型来创建对象的过程,称为类的实例化;
对于上面的人类,来实例化如:
public class Main{
public static void main(String[] args) {
Person person = new Person();//通过new实例化对象
person.eat();//成员方法调用需要通过对象的引用调用
person.sleep();
//产生对象 实例化对象
Person person2 = new Person();
Person person3 = new Person();
}
}
注意事项:
1.new 关键字用于创建一个对象的实例;
2.使用 . 来访问对象中的属性和方法;
3.同一个类可以创建多个实例;
类的成员
包含:字段、方法、代码块 、内部类和接口等。
字段(又称属性、成员变量)
作用:用于描述一个勒种包含哪些数据。
注意事项:
1.使用.访问对象的字段。
2.“访问”包含读和写。
3.对于一个对象的字段如果没有显示设置初始值,那么会给一个默认值。(只对于类)
默认值规则
- 对于各种数字类型, 默认值为 0.
- 对于 boolean 类型, 默认值为 false.
- 对于引用类型(String, Array, 以及自定制类), 默认值为null.
字段初始化
字段就地初始化
很多时候不希望字段使用默认值,而是需要显示的设定初值,如下:
class Person {
public String name = "张三";
public int age = 18;
}
方法
作用:用于描述一个对象的行为。
有一种特殊的方法称为 构造方法
在实力化对象的时候会被自动调用到的方法,方法名字和类名相同,用于对象的初始化。
static 关键字
修饰属性
用static修饰的属性称为静态属性,Java静态属性和类相关和具体实例无关。即同一个类的不同实例公用同一个静态属性。
静态属性 在方法区存储,而普通字段在堆中存储。
class Test{
// 默认值都为0
public int a;
public static int count;
}
public class Main{
public static void main(String[] args) {
Test t1 = new Test();
t1.a++;
Test.count++;
System.out.println(t1.a); // 输出1
System.out.println(Test.count); // 输出1
Test t2 = new Test();
t2.a++;
Test.count++;
System.out.println(t2.a); // 输出1
System.out.println(Test.count); // 输出2
}
}
修饰方法
在任何方法上应用 static 关键字,此方法称为静态方法。
- 静态方法属于类,不属于对象。
- 可以直接调用静态方法,而无需创建类的实例。
- 静态方法可以访问静态数据成员,并可以更改静态数据成员的值。
public static void fun(){}
注意事项
1.静态方法和实例无关,而是和类相关,则导致以下两个情况
- 静态方法不能直接使用非静态数据成员或调用非静态方法,因为非静态数据成员和方法都是和实例相关的。
- this和super两个关键字不能在静态上下文中使用,因为this是当前实例的引用,super是当前实例父类实例的引用,只是和当前实例相关的。
2.main方法为static方法。
修饰类
封装
问题: 软件开发的本质就是对程序复杂程度的管理. 如果一个软件代码复杂程度太高, 那么就无法继续维护. 如何管理复杂程度? 封装就是最基本的方法
写代码的时候经常会涉及两种角色: 类的实现者和类的调用者.
封装的本质就是让类的调用者不必太多的了解类的实现者是如何实现类的, 只要知道如何使用类就行了.这样就降低了类使用者的学习和使用成本, 从而降低了复杂程度
private 实现封装
被private修饰的成员变量或者成员方法,不能被类的调用者使用。
getter 和 setter 方法
当使用private修饰字段时,就无法在类的外部直接使用这个字段了,就需要使用getter和setter方法来获取和修改这个字段的值。
class Person {
private String name;//实例成员变量
private int age;
public void setName(String name){ // setter方法
this.name = name;//this引用,表示调用该方法的对象
}
public String getName(){ // getter方法
return name;
}
public void show(){
System.out.println("name: "+name+" age: "+age);
}
}
public static void main(String[] args) {
Person person = new Person();
person.setName("caocao"); // 修改私有属性的值
String name = person.getName(); // 获取私有属性的值
System.out.println(name);
person.show();
}
注意事项
- 不是所有的字段都一定要提供getter或setter方法的,需要根据实际情况决定提供哪种方法。
- 在IDEA中使用alt + insert (或F12)快速生成getter和setter方法。在VScode中使用鼠标右键 菜单->源代码 操作自动生成getter或setter方法。
构造方法
基本语法
作用:当使用new关键字实例化新对象时会被自动调用。用于完成初始化操作。
执行过程:
1.为对象分配内存空间。
2.调用对象的构造方法。
语法规则
1.方法名称必须与类名称相同
2.构造方法没有返回值类型声明
3.每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
注意事项
如果类中没有提供任何的构造函数,那么编译器会默认生成一个不带有参数的构造函数
若类中定义了构造方法,则默认的无参构造将不再生成.
构造方法支持重载. 规则和普通方法的重载一致。
class Person {
private String name;
public Person() {
this.name = "张三";
}
public Person(String name) {
this.name = name;
}
}
this 关键字
this表示当前对象的引用,可以借助this来访问对象的字段和方法。
代码块
字段的初始化方式有:
- 就地初始化
- 使用构造方法初始化
- 使用代码块初始化
介绍
使用**{}**定义的一段代码。
种类:根据代码块定义的位置以及关键字,可分为以下四种:
普通代码块
构造代码块
静态代码块
同步代码块(多线程部分)
普通代码块
定义在方法中的代码块,比较少见。如:
public class Main{
public static void main(String[] args) {
{ //直接使用{}定义,普通方法块
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
构造代码块
定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
class Person {
private String name;
public Person() {
}
{
// 构造(实例)代码块
this.name = "张三";
}
}
注意事项 :实例代码块优先于构造函数执行。
静态代码块
使用static定义的代码块。一般用于初始化静态成员属性。
class Person {
private String name;
private int age;
public Person() {}
{
// 构造(实例)代码块
this.name = "张三";
}
static {
// 静态代码块
age = 18;
}
}
注意事项:
- 不管创建多少个对象,静态代码块只会执行一次,且是最先执行的。
- 静态代码块执行完后,实例代码块执行,然后使构造函数执行。
重写 toString() 方法
可以使用 toString 这样的方法来将对象自动转成字符串。
class Person {
private String name;
private int age;
public Person(String name,int age) {
this.age = age;
this.name = name;
}
public void show() {
System.out.println("name:"+name+" " + "age:"+age);
}
//重写Object的toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Main {
public static void main(String[] args) {
person.show();
System.out.println(person);
}
}
注意事项:
- toString 方法会在 println 的时候被自动调用.
- 将对象转成字符串这样的操作我们称为 序列化.
- toString 是 Object 类提供的方法, 我们自己创建的 Person 类默认继承自 Object 类, 可以重写 toString 方法实现我们自己版本的转换字符串方法.
- @Override 在 Java 中称为 “注解”, 此处的 @Override 表示下面实现的 toString 方法是重写了父类的方法.
- IDEA快速生成Object的toString方法快捷键:alt + f12 (或者insert).
匿名对象
匿名对象是表示没有名字的对象.
- 没有引用的对象称为匿名对象.
- 匿名对象只能在创建对象时使用.
- 如果一个对象只是用一次, 后面不需要使用类,可以考虑使用匿名对象.
public class Main {
public static void main(String[] args) {
new Person("caocao",19).show();//通过匿名对象调用方法
}
}