作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:和我一起学java
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
点击免费注册和我一起刷题吧
文章目录
1. 面向对象和面向过程
2. 类的注意事项
3. 类的实例化
4. this 引用
5. 构造方法
6. 封装
7. 包
面向过程:分析出解决问题所需要的各个步骤,然后用许多函数实现这些步骤
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素
缺点:没有面向对象易维护、易复用、易扩展
面向对象:把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低
面向对象就是高度实物抽象化、面向过程就是自顶向下的编程
面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。面向过程就好像是传统的洗衣服的方式,整个过程少了一个环节都不能完成这个问题,按照该种方式来写代码,将来扩展或者维护起来会比较麻烦,而面向对象更像是现代的洗衣服过程,我们可以抽象出来四个对象,分别是:人、衣服、洗衣粉、洗衣机,洗衣服的过程是由四个对象之间交互完成的,人不用关心洗衣服的过程
面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景
Java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在面向对象的世界里,一切皆为对象
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等)
类的定义格式:
class ClassName{
field; //字段(属性)或者成员变量
method; //行为或者成员方法
}
class为定义类的关键字,ClassName为类的名字,{}中为类的主体
类中包含的内容称为类的成员
属性主要是用来描述类的,称之为类的成员属性或者类成员变量
方法主要说明类具有哪些功能,称为类的成员方法
注意事项:
类名注意采用大驼峰
定义成员前写法统一为public
一般一个文件当中只定义一个类
main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
public修饰的类必须要和文件名相同
不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改
认识实例化:
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象
new 关键字用于创建一个对象的实例
使用.来访问对象中的属性和方法
同一个类可以创建多个实例
类和对象说明:
1. 类是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员
2. 类是一种自定义的类型,可以用来定义变量
3. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
4. 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
this.成员变量
this.访问成员变量
this();访问构造方法
来看个问题:
形参名不小心与成员变量名相同:
public class Test {
public int year;
public int month;
public int day;
public void setDay(int year,int month,int day){
year = year;
month = month;
day = day;
}
public void printDay(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
Test test = new Test();
test.setDay(2022,7,25);
test.printDay();
}
}
已经在main 方法中调用了setDay方法并且传参,printDay没有打印出日期,这是因为局部变量优先,只是形参自己给自己赋值了,没有赋值到成员变量中。这时候要用到this
public class Test {
public int year;
public int month;
public int day;
public void setDay(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public void printDay(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
Test test = new Test();
test.setDay(2022,7,25);
test.printDay();
}
}
this引用:
指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成
this引用的特性:
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收,如图:
在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间
特性:
1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法),下面两个构造方法名字相同,参数列表不同,因此构成了方法重载
public class Test {
public int year;
public int month;
public int day;
//无参构造方法
public Test(){
this.year=1900;
this.month=1;
this.day=1;
}
//带有三个参数的构造方法
public Test(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的
public class Test {
public int year;
public int month;
public int day;
//带有三个参数的构造方法
public Test(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
//报错
Test t = new Test();
t.printDate();
}
}
注意:一旦用户定义,编译器则不再生成
如果编译器会生成,则生成构造方法是无参的,此处创建的对象也能通过编译,实际情况是报错,因此一旦用户定义,编译器则不再生成默认的构造方法
6. 构造方法中,可以通过this调用其他构造方法来简化代码
this();访问构造方法
public class Test {
public int year;
public int month;
public int day;
public Test() {
//调用本类中的其他构造方法
this(2022,8,4);
System.out.println("不带参数的构造方法");
}
//带有三个参数的构造方法
public Test(int year, int month, int day) {
System.out.println("带参数的构造的方法");
this.year = year;
this.month = month;
this.day = day;
}
public static void main(String[] args) {
Test t = new Test();
}
}
注意:
this(...)必须是构造方法中第一条语句,放在其他行就会报错
不能形成环,循环调用会报错
public Date(){
this(1900,1,1);
}
public Date(intyear,intmonth,intday){
this();
}
/*无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器
形成构造器的递归调用编译报错:Error:(19,12)java: 递归构造器调用*/
7. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节。
封装的概念:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用
Java中提供了四种访问限定符:
No |
范围 | private | default | protected | public |
---|---|---|---|---|---|
1 | 同一包中的同一类 | ✔ | ✔ | ✔ | ✔ |
2 | 同一包中的不同类 | ✔ | ✔ | ✔ | |
3 | 不同包中的子类 | ✔ | ✔ | ||
4 | 不同包中的非子类 | ✔ |
public(公共的):具有最大的访问权限,可以访问任何一个在CLASSPATH下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式
default(默认的):什么都不写时的默认权限,任何处于本包下的类、接口、异常等,都可以相互访问
protected(受保护的):protected修饰符,它主要的作用就是用来保护子类的
private(私有的):访问权限仅限于类的内部,是一种封装的体现,例如,大多数的成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问
private修饰name后,只能同一包中的同一类进行调用,否则会报错
如果想在其它类中调用,需要设置方法,通过方法使用
public class Person { private String name; public int age; public void setName(String name){ this.name = name; } public static void main(String[] args) { Person person = new Person(); person.setName("hahaha"); } }
注意:一般情况下成员变量设置为private,成员方法设置为public
get,set方法可以用编译器自动生成:
为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可
自定义包:
1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包
2. 在弹出的对话框中输入包名
3. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可
4. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来
5. 同时我们也看到了, 在新创建的Test.java文件的最上方, 就出现了一个 package 语句
常见的包
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编程开发包
祝大家七夕快乐!!还有我和小王也快乐!
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!