面向对象

1.定义

啥是面向对象?

面向:找、拿。

对象:东西。

面向对象编程:找或拿东西过来编程。

2.类

如果要用对象,必须先设计类,创建对象并使用

类(设计图):是对象共同特征的描述;

对象:是真实存在的具体实例。

结论:在Java中,必须先设计类,才能创建对象并使用。

2.1如何设计类

类

案例:

定义一个Car类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.javabean;

public class Car {
/*成员变量*/
String name;
double price;

/*方法*/
public void start(){
System.out.println(name + "启动了");
}
public void run(){
System.out.println("价格是" + price);
}
}

测试类调用Car类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.javabean;

public class test {
public static void main(String[] args) {
//创建汽车对象
Car c = new Car();
c.name = "bwm";
c.price = 465;
c.start();
c.run();

Car c1 = new Car();

}
}

idea中的f:field(类的属性)

m:method(方法)

image-20220704155004410

2.2类的补充

1.类名要大写,不能用关键字,驼峰模式,合法标识,且有意义

2.一个Java文件中可以定义多个class类,但只能有一个public类,其他的类不能加public,并且,public修饰的类必须成为代码文件名。

重要:所以实际开发还是建议一个代码文件定义一个类

3.成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;

一般无需指定初始值,存在默认值。

默认值的规则:

byte short int long : 0

double float : 0.0

Boolean : false

String : null

例子:

通常写的:String name;

实际上:String name = null;(null是系统默认的)

3.构造器(有参和无参)

3.1构造器的作用

定义在类的,可以用于初始化一个类的对象,并返回对象的地址。****说白了,可以通过它得到一个对象

  • 初始化类的对象,并返回对象的地址。

Car c = new Car();

3.2构造器的使用

无参构造器,默认存在的。

有参构造器,在初始化对象的时候,同时可以接受参数为对象进行赋值。

案例:

创建一个Shop类,定义有参无参。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String name;
double price;

//无参数的构造函数
public Shop() {
System.out.println("这是无参");
}

//有参数的构造函数
public Shop(String name, double price) {
System.out.println("这是有参");
this.name = name;
this.price = price;
}

创建一个People类,使用Shop类

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
Shop s = new Shop();
s.name = "无参,括号里没函数";
s.price = 120;
System.out.println(s.name);
System.out.println(s.price);

Shop s1 = new Shop("有参",130);
System.out.println(s1.price);
System.out.println(s1.name);
}

s里面new Shop里没有参数,对应无参

s1里面new Shop里有参数,对应有参

额外知识:Double 和 double

  1. double是基本数据类型,不是一个类;Double是原始数据类型,是一个类,Object的一个子类
  2. double没有方法,Double有自己的属性和方法
  3. double只创建引用,Double创建对象
  4. 集合类不能存放double,只能存放Double
  5. 两者存放位置不同:
  6. Double 整数报错,double则不会

3.3构造器的注意事项

任何类定义出来,默认就自带了无参数构造器,写不写都有。

  • 但是一旦定义了有参数构造器,无参数构造器就没有了,如果还想用无参数构造器,此时就需要自己手写一个无参数构造器了。否则报错

4.this关键字

4.this关键字是什么

  • 可以出现在构造器、方法中
  • 代表当前对象的地址
  • 在构造器无参中,已经出现了this,(虽然是自动生成的)
  • this(可以理解为当前对象的成员变量,而不是形参)
1
2
3
4
5
6
public Shop(String name, double price) {
System.out.println("这是有参" + this);
//加了this是给当前的对象,不加是另一边传过来的形参
this.name = name;//取了一个名称叫name,传给了当前对象的name
this.price = price;
}

this是调用对象赋值,不加是直接复制。指定当前对象,好区分分。

5.封装

面向对象的三大特征:封装、继承、多态。

封装的原则;对象代表什么,就得封装对应的数据,并提供对应数据的行为。

比如人开车,但是“开”是定义在车的方法里,车都会被开,但是人不一定开车。人只是调用这个方法。

封装思想:可以省下很多的事,大部分常用的方法Sun公司都会提供,不用自己去写了,找到对应的方法就好了。如果实在没用,只能自己写了。

有什么事,找对象,调方法就行了。

对象代表什么,就得封装对应的数据,并提供数据对应的行为。

5.1如何更好的封装

1.一般建议使用对private(私有、隐藏)关键字修饰。(private修饰的成员只能 在当前类中进行访问)

2.为每个成员变量提供配套public修饰的getter和setter方法。

可以在setter里输入条件,满足条件

所得到的结果都要用条件满足。

输入值:fan.setAge(30);(对象名.方法名())

输出值:System.out.println(fan.getAge());

  • “&&”表示 与,意为同时都要满足。“||”表示 或,意为二者或多着只要满足其中一个。

6.Java Bean

也可以称为实体类,其对象可以用于程序中封装数据。

  • 用于实体类(学生类、老师类、汽车类),不是什么test类,

标准JavaBean必须满足如下要求

1.成员变量使用private修饰

2.提供成员变量对应的set/get方法,暴露其赋值(可能会觉得有set方法要校验加判断,因为数据可能不安全。但是因为数据传过来就已经是一个合法的判断。所以没必要,可以写但没必要)

3.必须提供一个无参构造器,有参构造器可写可不写。(但是写了有参,必须要写无参)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private String name;
//无参
public User() {
}
//有参
public User(String name) {
this.name = name;
}
//get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

6.1set和get

setName 和 getName只是两个标识符,代表方法。

  • setName用来设置的,getName用来获取的

getName,因为name是private不能在其他类中直接获取

你在一个类里面写的main方法,可以直接访问私有属性,要在外面创建对象,赋值后要通过get方法才能访问属性

7.补充:成员变量和局部变量

成员变量:在类中(class类),int age;默认值0。堆内存。对象创建存在

局部变量:在方法中(main),int age = 18;没有默认值要定义。栈内存。方法运行存在

局部变量的作用域在main方法的大括号里,跳出括号就没有了,成员变量则不好界定。

8.类、对象、方法

类是封装对象的属性和行为的载体,而对象的方法以成员方法的形式存在,类是构建对象的模板。

对象是类的具体实例。

人话:类是一个模版(属性和行为),比如动物类,动物有姓名,年龄。这就是属性,动物会跑会叫,这是方法(类方法),这也是它的行为。

对象是个具体的实例,比如加菲猫,姓名叫加菲猫,跑的慢。

1
Cat 加菲猫 = new Car();

对象则是new这个类取的一个叫加菲猫的名称。

9.成员变量和局部变量

image-20220728065751923

image-20220727204239462