java基础学习笔记——day09
第三章——面向对象
1. 面向对象和面向过程
这里用人开车的例子说明:
-
面向过程: 人开车,人是一个对象,车是一个对象,我们只需要知道,人有开车这个功能,车有被开这个功能,我们不需要知道人是怎样开车的,车是怎样组成的或者被开的,只要知道人开车能到目的地就行
-
**面向过程:**人开车,人是怎样开车的我们要知道怎样开车的(考驾照,买车,上车,点火,启动,踩离合,踩油门……),里面我们每一步都要划分成详细的一个一个过程,这就是面向过程
-
面向过程和面向对象的区别:
- 针对小问题,面向过程是解决办法。但是面对一些复杂问题时,面向过程显然力不从心。面向过程是微 观上解决问题的方式,管得太多了。
- 面向对象是解决问题的另外一种方式,针对一些简单问题有点大材小用,针对复杂问题就变得极其轻 松。面向对象是从宏观上把控事务的整体走向。管的太少了。
- 面向对象和面向过程不是相互独立的而是相互依存的。通过面向对象去从整体上思考问题的大致方向, 但是后实际解决的过程中还是通过面向过程去执行的。
-
编码的过程中而言,存在一个需求,先从宏观上整体看待需求,再从微观上去实际编码解决问题。
2. 对象
2.1 什么是对象
-
在java中万事万物都是对象(人,电脑,杯子,鼠标)
-
人能吃饭,跑步;电脑能完游戏,敲代码;杯子能装水;鼠标能帮助我们控制电脑
-
对象对应了相应的功能,我们不需要知道这些功能是怎样来的,怎样实现的我们只需要知道他们有这个功能,并且能拿来用就行了,这就是对象
-
-
面向对象大好处和魅力也在于此,就是减低了使用者的使用复杂度,提高了被使用者的安全 度。
2.2 类和对象的关系
-
**类:**类就是将具有相同特征的许多事物归为一种类别
-
**对象:**对象就越是类具体事务的体现
-
比如,鸟类就是一个类,里面的对象有啄木鸟(啄木),老鹰(抓小鸡),喜鹊(报喜)
在java中的类和对象:
- 类:class修饰的 一个类可以产生很多个对象。
- 对象:基于类的一个实例化的表现形式
- 类的产生是依赖于对象的,类是将对象中相同特征或者是行为抽取出来归为一类
- 对象的产生是依赖于类的,如果没有类是无法产生该类的对象的,该类的实例
- 类是对于对象的抽像(抽取像的部分),对象是类的具象化的表现形式。
3. 如何编写类和对象
3.1 编写类
- 类是为了产生对象的,而对象存在的本质是为了能够帮助我们去实现一个具体的业务。对象对于使用者 而言,能够知道的有
- 外在的表现形式:姓名、性别、身高、体重、籍贯 : 通过成员变量来实现的
- 内在的功能:能力:能够做什么:吃饭、睡觉、打豆豆、买烟、开车: 通过方法实现的
- 成员变量也好、方法也罢都是非静态修饰的
public class Person{
String name;//外在属性:名字、性别、年龄
char gender;
int age;
public void eat(){ //人能吃饭
System.out.println("吃饭");
}
public void sleep(){//人会睡觉
System.out.println("睡觉");
}
}
3.2 编写对象
-
java中通过new关键词来产生当前类的一个具体的实例、对象。
-
语法:
类名 变量名 = new 类名();
public class PersonText{
public static void main(String[] args){
Person p = new Person();
p.eat();
p.sleep();
System.out.println(p.name);
}
}
- 输出结果:
吃饭
睡觉
null
- 类是一个引用类型,我们定义的所有的类都是一个自定义的数据类型,这些数据类型都是引用类 型。
- 凡是引用类型在创建对象时必须通过使用 new 关键词来创建。
- new关键字的作用:
- 开辟空间:在堆内存中开辟一个空间
- 赋初始值:给类中的成员变量赋初始值
- 指向引用:在新创建的变量中存储一个开辟的堆内存的地址
4. 构造器
4.1 什么是构造器
- 构造器就是java中用来产生对象的特殊方法 ,这个特殊方法就是类中的一个构造器
4.2 构造器的声明
4.2.1 无参的构造器
public class 类名{
//创建一个无参构造器
public 类名(){
构造器中的执行语句;
}
}
- 构造器的方法名要和类名一致
- 构造器方法没有返回值
注意事项:
- 在一个类中,如果没有创建任何一个构造器,呢么java会自动填充一个空参数的构造器(在代码中看不见)
4.2.2 带参数的构造器
public class 类名{
String name;
int age;
//创建一个带参构造器
public 类名(String yname){
name = yname;//构造器中的执行语句;
}
}
测试:
class Person{
String name;
int age;
//创建一个带参构造器
public Person(String yname){
name = yname;//构造器中的执行语句;
}
}
public class PersonText{
public static void main(String[] args){
Person p1 = new Person("小王");
Person p2 = new Person("小李");
Person p3 = new Person("小刘");
System.out.println(p1.name);
System.out.println(p2.name);
System.out.println(p3.name);
}
}
结果:
小王
小李
小刘
- 注意
- 如果一个类中存在带参构造器,那么无参构造器如果不显示编写,则不存在。如果显示编写,则还 有。
- 构造器也存在重载。
5. this 关键字
5.1 什么是this
- 代表的是当前对象的。谁在调用谁是当前对象。
- 大多数情况下this.都是可以省略的
- 当出现了同名的变量时,this.是不可以省略的。此时this.的作用是用来区分同名变量。
5.2 this的使用
- this关键词,一共有两种用法,称之为 this. 和 this()
- this. :当出现了同名的变量时,this.是不可以省略的。此时this.的作用是用来区分同名变量
class Person{
String name;
int age;
//创建一个无参构造器
pubilic Person(){
this.eat();//用this. 调用该类的eat()方法
}
//创建一个带参构造器
public Person(String name,int age){
this.name = name;// this. 用来区分同名变量
this.age=age;
//如果不适用this. 那么java就无法区分两个同名变量 name和age,就会报错
}
public void eat(){
System.out.println("吃饭了");
}
}
public class PersonText{
public static void main(String[] args){
//调用无参构造器
Person p1 = new Person();
System.out.println(p1.name);
//调用有参构造器
Person p2 = new Person("小李",18);
System.out.println(p2.name);
System.out.println(p2.age);
}
}
结果:
吃饭了
null
小李
18
- this() :用来实现构造器之间的互相调用。
class Person{
String name;
int age;
//创建一个无参构造器
pubilic Person(){
this("小李",18);//通过this() 调用了带参构造器
}
//创建一个带参构造器
public Person(String name,int age){
this.name = name;
this.age=age;
}
public void eat(){
System.out.println("吃饭了");
}
}
- this() 作用
- 实现了构造器之间的相互调用
- 其他方法中不能使用this(),只能在构造器中使用
- 必须保证this()在构造器的第一行
6. static 关键字
6.1 含义
- static的意思是: 静态的 共享的
- 通过static修饰的方法、类、就是静态的方法、类
6.2 static的使用
- 在static中使用static修饰的
public class Person{
static int num=10;
public static void main(String[] args){
System.out.println(num); //直接访问
}
}
- 在static中使用非static修饰的
public class Person{
int num=10;
public static void main(String[] args){
Person p =new Person();
System.out.println(p.num);
//通过创建对象访问
}
}
- 在非static中使用static修饰的
public class Person{
static int num=10;
public static void main(String[] args){
Person p =new Person();
p.method();
}
public void method(){
System.out.println(num); //直接变量名和方法名访问
}
}
- 在其他类中访问静态内容可以直接通过类名.方法名/变量名直接访问
- 静态内容在其他类中访问时可以通过类名直接 . ,也可以通过对象 . (不推荐使用)
public class Test{
public static void main(String[] args){
System.out.println(Person.num);
}
}
6.3 注意事项
- static修饰的内容是隶属于类的,类被加载,静态内容就被加载到内存中了。
- 非static修饰的内容是隶属于对象的,对象存在,非static的内容才能被调用。
- 类信息是先于对象存在的。创建对象时类一定被加载到内存中了,但是如果类被加载到内存中,对 象不一定存在。