目录
1.面向对象的初步认识
1.1什么是面向对象
java是一门纯面向对象的语言面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情
1.2 面向对象和面向过程
面对过程
就好比你去奶茶店买奶茶,店员根据你的要求下单去制作一杯你所要的奶茶,他需要经历制作奶茶的过程,这就叫做面向过程。
面向对象
你去奶茶店,对象就是你,店员,奶茶
至于制作奶茶的过程并不用你去。这就叫做面向对象。
2.类和对象
2.1类的定义
类是对一个实体(对象)进行描述,主要去描述该实体(对象)具体有哪些特征,哪些功能
例如:空调,他是一个品牌,在java中可以将其看成一个类别。
属性:品牌,型号,重量,大小尺寸等
功能:制冷,制热,定时等
对于这些属性和功能的定义,在java中需要用到class关键字
类的定义
对于类的定义:
class 类名 {}
{}内是类的属性和方法,
属性:用来描述类的,又称为成员变量/成员属性
方法:主要用来说明类有哪些功能,叫做成员方法
(定义一个类,就相当于在计算机中定义了一个新的类型)
class Conditioner{
public String make;//品牌
public String model;//型号
public String color;//颜色
public int weigh;//重量
public int high;//高
public void mature(){
System.out.println("制热功能");
}
public void cool(){
System.out.println("制冷功能");
}
public void time(){
System.out.println("定时");
}
}
2.2定义类和方法的注意事项:
1.类名采用大驼峰定义,方法名采用小驼峰定义
2.成员前写法统一为public,后续讲解几个访问权限符再细讲
除外
1.在定义类时,一个文件只放一个类,方便后续维护
2.main方法所在的类一般要用public修饰
3.public修饰的类必须和文件名相同
2.3对象
描述完类,那我们就要来使用类,如何使用?
我们需要用到new关键字,来为我们创建一个对象
格式: 类名 对象名= new 类名();
注意:1.new关键字用于创建一个对象
2.可以使用(.)点来引用类中的属性和方法
3.一个类可以实例化多个对象
class Conditioner{ public String make;//品牌 public String model;//型号 public String color;//颜色 public int weigh;//重量 public int high;//高 public void mature(){ System.out.println("制热功能"); } public void cool(){ System.out.println("制冷功能"); } public void time(){ System.out.println("定时"); } public void show(){ System.out.println("品牌:"+make+"\n型号:"+model+"\n颜色:"+color+"\n重量:"+weigh+"\n高:"+high); } public static void main(String[] args) { Conditioner c=new Conditioner(); c.make="meidi"; c.model="s250"; c.color="yellow"; c.weigh=100; c.high=1; c.show(); c.cool(); } }
结果:
new的对象,是在栈区还是堆区存放?
当我们new完一个对象后,会在栈区分配一块空间用来存储对象的地址,在堆区分配一块空间存储对象,用来存放对象中的属性,在图中我们可以看到并没有存储方法(方法是在你调用后,才会向内存申请空间)
2.4构造方法(构造器)
构造方法(构造器)是一个特殊的成员方法,名字必须和类名相同,在创建对象时,由编译器自动调用,并且整个对象的生命周期中只调用一次
构造方法在什么时候调用呢
特性:
1.名字与类名相同
2.没有返回值类型,void也不行
3.创建对象时自动调用,并且在对象的生命周期中只调用一次
4.构造方法可以重载
5.当我们没有定义构造方法时,编译器会给我们提供一个不带参数的构造方法
但是,如果我们自己定义了构造方法,编译器不再会提供不带参数的构造方法
例如:
这里我们自己创建了三个构造方法 ,当然,我们可以根据我们想要的进行创建构造方法
我们来调用一下,如图
2.5this的使用
在对象中的代码中,如果我们一直c.,c.太麻烦了,我们可以在类中定义一个方法,通过调用方法进行赋值。在下面中,我们定义一个方法来进行赋值。
但是这样写,如果我们在无意之间把参数名和成员名共用呢。这时,会发现打印的全是null和0 ,为什么会这样?对于成员变量和局部变量,会遵循局部优先,这时就是局部变量给局部变量赋值。并没有对成员变量造成影响,所以就会打印null和0
但如果我们在前面加this呢?
这是我们空调看到成员变量确实发生了改变。
什么是this引用?
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过this去进行访问的,只是所以的操作都是透明的,我们不需要去传递,编译器自动完成
注意:this引用之间不能形成环
且this必须位于方法的第一行
3.1封装
面向对象程序有三大特性:封装、继承、多态。
3.1什么是封装?
将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。(简单来讲就是套壳屏蔽细节)
例如:你在使用电脑的时候,你不需要关注内部的核心部件,比如CPU是如何设计的,你只需要知道如何开机,关机,使用电脑即可。
3.2访问权限符
java中主要是通过类和访问权限来实现封装:
类:可以将数据以及封装数据的方法结合在一起。
访问权限:用来控制方法或者字段能否直接在类外使用。
Java提供了四种访问权限符:
这些访问操作符的范围怎么理解呢?
public:可以比作一个人的外貌,谁都看得见。
default:可以认为是你的事情在家里(同一个包)不是秘密,但对于其他人来说就是隐私。
private:就只有自己知道,其他人都不 知道
先来讲public
我们在创建类时,只能用public或者不用访问权限符修饰,默认包访问权限。
4.包
4.1包的含义
为了更好的管理类,我们把多个类收集在一起成为一组,称为软件包。
类似于目录。有了包,方便我们更好地对类进行管理,在每个java文件最好只写一个类,方便查看。当然,一个java文件下也可以有多个类。
例如,为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
包是对类、接口等封装机制的体现,是一种对类或接口等的很好的组织方式。
作用:在同一个工程中允许存在相同名称的类,只要处在不同包即可。
4.2如何导入包中的类
法一:java.包名.包中的类;
java中给我们提供了很多现成的类供我们使用,例如使用Date类:可以使用java.util.Date来来导入java.util这个包中的Date类。
public class testmain1 {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
//可以一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
但是如果我们每次都写java.util,会很麻烦,我们可以使用import语句进行导包。
如果还想使用包中的其他类,我们可以使用import java.util.*; 当然,这两种,推荐使用第一种,在导入包的时候指定导入的类名,以防出现冲突。例如: 这种情况是因为在两个包中,都有Date类,编译器不知道你要使用的是哪个就会报错。所以最好使用第一种。
我们可以使用import static 导入包中静态的方法和字段。
4.3自定包
基本规则:
1.在文件的最上方加上一个package语句指定代码是在哪个包中。
2.包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式(如com.bai.demo2).
3.包名要和代码路径相匹配,例如:创建com.bai.demo2的包,那么会存在一个对应的路径com/bai/demo2来存储代码.
4.如果一个类没有package语句,则该类被放到默认包(src)中。
4.3.1包的创建操作步骤:
在IDEA中新建一个包:
2.在弹框中输入包名
3.回车后,包就创建好了,在包中创建一个java文件。
同时,我们也可以看到在test最上方出现了package语句
4.4常见的包
1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
2. java.lang.reflect:java 反射编程包;
3. java.net:进行网络编程开发包。
4. java.sql:进行数据库开发的支持包。
5. java.util:是java提供的工具程序包。(集合类等) 非常重要
6. java.io:I/O编程开发包。
5.static成员和方法
5.1static成员
在java中,被static修饰的成员,称为静态成员,也叫做类成员,不属于某个具体的对象,是属于所有对象共享的。
特性:不属于某个具体对象,是类的属性,所以对象共享,不存在某个对象的空间中
2.既可以通过对象访问,也可以通过类名访问,但一般推荐使用类名
3.类变量存储在方法区
4.生命周期伴随着类的一生(随着类的加载而创建,随着类的卸载而销毁)
5.2static方法
在java中,被static修饰的从成员方法称为静态成员方法,是类的方法,不是某个对象特有的,静态成员一般是通过 静态方法来访问的。
注意:1.不能在静态方法中访问任何非静态成员变量
2.静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
3.静态方法不可以重写,不能用来实现多态
6.代码块
6.1什么是代码块
使用{}定义的一段代码称为代码块,根据代码块定义的位置以及关键字,又可以分为四种:
1.普通代码块 ;2.构造块;3.静态块;4.同步代码块
6.2四种代码块
1.普通代码块:定义在类中的代码块(不加修饰符)。也叫实例代码块,一般用于初始化实例化成员变量
2.构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
3.静态代码块:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
注意:静态代码块只执行一次,无论有多少个对象
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行
代码块的执行顺序
- 静态代码块
- 实例代码块
- 对应构造方法
- 同种类型,按照定义顺序来
- 注意:如果存在父类,那么先执行父类的静态代码块,再执行子类的静态代码块,再执行父类的实力代码块,构造块,最后执行子类的实例代码块,构造代码块(属于继承的内容)