Java学习经历(第二周)

本文详细介绍了Java的面向对象编程特性,包括类与对象的概念,对象在内存中的存储方式,属性、方法、构造器的使用,以及this关键字的作用。此外,还讲解了包的创建与访问修饰符的含义,以及封装、继承和多态的基本概念和实现。通过对这些核心概念的理解,读者能够更好地掌握Java的面向对象编程思想。
摘要由CSDN通过智能技术生成

Java学习经历第二周

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


面向对象上


提示:以下是本篇文章正文内容,下面案例可供参考

七、面向对象编程

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1.类与对象

Java语言的最大特点就是面向对象。类是抽象的,代表一类事物,是一种数据类型。对象是具体的,代表一个具体事物,是实例。通过类和对象,就能将程序比作现实世界,里面存在着一个个不同种类的事物,通过类与对象(OOP),来实现新的需求。

2.对象在内存中的存在形式

Jvm的内存中分为栈、堆和方法区。

(1).栈:描述的是方法执行的内存模型,每个方法被调用时都会创建一个栈,栈具有“先进先出,后进后出”的特点,一般存放基本数据类型(局部变量)。

(2).堆用于储存创建好的对象或数组,如对象中的基本数据类型就会直接储存在其中,引用类型如字符串则会储存在常量池中。

(3).方法区属于堆,主要储存和加载类和常量信息,常量池就属于方法区。

3.属性

和C++中的数据成员相似,是类的一个组成部分,一般是基本数据类型,也可是引用类型,属性如果不赋值,有默认值,规则和数组一致。具体说: int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000, boolean false,String null。

4.创建对象和访问属性和流程

(1).创建对象的基本语法

先声明再创建: Cat cat ; //声明对象

cat cat = new Cat(); //创建

直接创建 : Cat cat = new Cat();

(2)访问属性

基本语法:对象名.属性名;

如:cat.name ;

cat.age ;

(3)Java创建对象的流程

Person p = new Person();

p.name = “jack”;

p.age = 1 ;

  1. 先加载 Person 类信息(属性和方法信息, 只会加载一次)

  2. 在堆中分配空间, 进行默认初始化(看规则)

  3. 把地址赋给 p , p 就指向对象

  4. 进行指定初始化, 比如 p.name =”jack”

5.方法

类似于C++中的成员函数,可以实现对象的一些行为。

(1)方法使用

1.方法写好后,如果不去调用(使用),不会输出。

  1. 先创建对象 ,然后调用方法即可。

(2) 语法

访问修饰符 返回数据类型 方法名(形参列表…)

{ 语句;

return 返回值;

}

例如:

public void speak() { System.out.println(“我是一个好人”); }

  1. public 表示方法是公开

  2. void : 表示方法没有返回值

  3. speak() : speak 是方法名, () 形参列表

  4. {} 方法体,可以写我们要执行的代码。

部分细节同C++相似。

方法调用小结:

1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)。

2.当方法执行完毕,或者执行的return语句时就会返回到调用方法的地方。

3.返回后,继续执行方法后面的代码。

4.当main方法执行完毕,整个程序退出。

(3)基本数据类型的传参机制:同C++函数传参规则相同,基本数据类型传递是值拷贝,形参的改变不会影响实参,引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!

(4)Java中的方法也能递归,从而解决一些特定的问题。

(5)方法重载

规则同C++的函数重载相似。

可变参数:java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。

基本语法:访问修饰符 返回类型 方法名(数据类型… 形参名) { }

例如:
在这里插入图片描述
​​​​​​​
输出
在这里插入图片描述

一个方法就能实现2个形参,3个形参乃至无穷多个的形参的相加。

注意事项:

1.可变参数的实参可以为0个或任意多个。

2.可变参数的实参可以为数组。

3.可变参数的实参本质上就是数组。

4.可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后。

5.一个形参列表中只能出现一个可变参数。

6.作用域

1.全局变量:就是属性,作用域为整个类。

2.局部变量:除属性外的其他变量,作用域为定义它的代码区。

注意:

1.全局变量有默认值,可以不赋值直接使用,局部变量没有默认值,必须赋值后才能使用。

2.全局变量和局部变量可以重名,访问时按就近原则。

3.在同一个作用域中,局部变量间不能重名。

4.全局变量既可以被本类访问,也可以通过调用对象的方式在其他类中访问,局部变量只能在本类对应的方法中访问。
5.只有全局变量可以加修饰符。

7.构造器

Java中的构造器类似于C++中的构造函数

1.基本语法

[修饰符] 方法名(形参列表){

方法体;

}

特点:1) 方法名和类名相同 2) 没有返回值 3) 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化(并非创建对象)。4)构造器也能重载。
(8)this关键字

1.具体用途类似C++中的this指针,Java虚拟机会给每个对象分配this,代表当前对象。

2.具体细节:

  1. this 关键字可以用来访问本类的属性、方法、构造器 。

  2. this 用于区分当前类的属性和局部变量 。

  3. 访问成员方法的语法:this.方法名(参数列表);

  4. 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)。

  5. this 不能在类定义的外部使用,只能在类定义的方法中使用。

8.this关键字

1.具体用途类似C++中的this指针,Java虚拟机会给每个对象分配this,代表当前对象。
2.具体细节:

  1. this 关键字可以用来访问本类的属性、方法、构造器 。
  2. this 用于区分当前类的属性和局部变量 。
  3. 访问成员方法的语法:this.方法名(参数列表);
  4. 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)。
  5. this 不能在类定义的外部使用,只能在类定义的方法中使用。

9.包


1.作用:1)可以区分相同名字的类。2)当类很多时便于管理,。3)控制访问范围。

2.本质:就是在不同的文件夹来保存类文件。

3.创建:将光标放置src文件上,点击
在这里插入图片描述
再将方标放置创建的包中,新建一个类。
在这里插入图片描述
注意:包的命名包含数字,字母。下划线,小圆点,不能用数字开头,也不能是关键字或保留字。

4.引入包

Java中常用的包例如: java.util.* //util 包,系统提供的工具包, 工具类,使用 Scanner。

语法:import 包。
在这里插入图片描述
表示将改包的所有类都引入。

之前输入时引用的import java.util.Scanner则代表中引入一个类Scanner。

细节:

1).package的作用是声明当前类所在的包,需要放在类的最上面,且一个类中最多只有一句package。

2).import位置放在package的下面,类的前面,可以有多句。

10.访问修饰符

1.概念:java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限:

  1. 公开级别:用 public 修饰,对外公开。
  2. 受保护级别:用 protected 修饰,对子类和同一个包中的类公开。 3) 默认级别:没有修饰符号,向同一个包的类公开。
  3. 私有级别:用 private 修饰,只有类本身可以访问,不对外公开。
    在这里插入图片描述
    2.注意
    1)修饰符可以修饰类中的属性,成员方法以及类。
    2)只有默认和public才能修饰类。

八、封装继承和多态

1.封装

1.封装:就是把属性和方法封装在一起,将属性保存在内部,程序的其他部分只有通过方法,才能对属性操作。
2.实现步骤:
1)将属性用private修饰
2)提供一个公共的set方法,用于对属性判断并赋值。
3)提供一个公共的get方法,用于获取属性的值。
例如: 在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出
在这里插入图片描述

实现一个简易的封装。

2.继承​

(1)介绍:继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中 抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来 声明继承父类即可。
(2)语法:class 子类 extends 父类{}
(3)细节:

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,需要通过父类提供公共的方法去访问。
  2. 子类必须调用父类的构造器,完成父类的初始化。
  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过 。
  4. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表) 。
  5. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)。
  6. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器 。
  7. java 所有类都是Object类的子类, Object是所有类的基类。
  8. 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)。
  9. 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
    (4)super关键字

1.介绍:super 代表父类的引用,用于访问父类的属性、方法、构造器。

2.语法

1)访问父类的属性(不能访问private属性):super.属性名;

2)访问父类的方法(不能访问private方法):super.方法名(参数列表)

3)访问父类的构造器:super(参数列表)

简单案例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出
在这里插入图片描述

3.super的用处

1)当子类中有和父类的成员重名时,为了访问父类的成员,必须通过super。

2)super不限于中访问父类,如果爷爷类中有本类的同名成员也可以通过super,super访问遵循就近原则。

4.方法覆盖
1.介绍:子类中的方法和父类的某个方法的名称、返回类型、参数一样,则说明子类的该方法覆盖了父类的方法。

2.条件

1)子类方法的形参列表,方法名称,要和父类方法发形参列表,方法名称完全一样。

2)子类方法的返回类型和父类方法的返回类型一样,或者是父类返回类型的子类。

3)子类方法不能缩小父类方法的访问权限。

案例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

输出
在这里插入图片描述

3.多态

1.方法的多态:重写和重载体现多态。

2.对象的多态

一个对象的编译类型和运行类型可以不一致。
编译类型在定义对象时就确定了不能改变,运行类型可以改变。
编译类型看定义时=号的左边,运行类型看=号的右边
3.多态的向上转型

(1)实际上是父类的引用指向了子类的对象

(2)语法:父类类型 引用名=new 子类类型();

(3)可以调用父类的所有可访问的成员,不能调用子类特有的成员。

规则:

(1)在编译阶段,能调用哪些成员,是由编译类型来决定的 /

(2)最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法,然后调用,规则我前面我们讲的方法调用规则一致。

4.多态的向下转型

(1)语法:子类类型 引用名=(子类类型)父类引用
(2)只能强转父类的引用,不能强转父类的对象。
(3)父类的引用必须指向当前目标类型的对象
(4)可以调用子类类型中的所有成员。

5.属性没有重写之说!属性的值看编译类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值