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 ;
-
先加载 Person 类信息(属性和方法信息, 只会加载一次)
-
在堆中分配空间, 进行默认初始化(看规则)
-
把地址赋给 p , p 就指向对象
-
进行指定初始化, 比如 p.name =”jack”
5.方法
类似于C++中的成员函数,可以实现对象的一些行为。
(1)方法使用
1.方法写好后,如果不去调用(使用),不会输出。
- 先创建对象 ,然后调用方法即可。
(2) 语法
访问修饰符 返回数据类型 方法名(形参列表…)
{ 语句;
return 返回值;
}
例如:
public void speak() { System.out.println(“我是一个好人”); }
-
public 表示方法是公开
-
void : 表示方法没有返回值
-
speak() : speak 是方法名, () 形参列表
-
{} 方法体,可以写我们要执行的代码。
部分细节同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.具体细节:
-
this 关键字可以用来访问本类的属性、方法、构造器 。
-
this 用于区分当前类的属性和局部变量 。
-
访问成员方法的语法:this.方法名(参数列表);
-
访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)。
-
this 不能在类定义的外部使用,只能在类定义的方法中使用。
8.this关键字
1.具体用途类似C++中的this指针,Java虚拟机会给每个对象分配this,代表当前对象。
2.具体细节:
- this 关键字可以用来访问本类的属性、方法、构造器 。
- this 用于区分当前类的属性和局部变量 。
- 访问成员方法的语法:this.方法名(参数列表);
- 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)。
- 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 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限:
- 公开级别:用 public 修饰,对外公开。
- 受保护级别:用 protected 修饰,对子类和同一个包中的类公开。 3) 默认级别:没有修饰符号,向同一个包的类公开。
- 私有级别:用 private 修饰,只有类本身可以访问,不对外公开。
2.注意
1)修饰符可以修饰类中的属性,成员方法以及类。
2)只有默认和public才能修饰类。
八、封装继承和多态
1.封装
1.封装:就是把属性和方法封装在一起,将属性保存在内部,程序的其他部分只有通过方法,才能对属性操作。
2.实现步骤:
1)将属性用private修饰
2)提供一个公共的set方法,用于对属性判断并赋值。
3)提供一个公共的get方法,用于获取属性的值。
例如:
输出
实现一个简易的封装。
2.继承
(1)介绍:继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中 抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来 声明继承父类即可。
(2)语法:class 子类 extends 父类{}
(3)细节:
- 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,需要通过父类提供公共的方法去访问。
- 子类必须调用父类的构造器,完成父类的初始化。
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过 。
- 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表) 。
- super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)。
- super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器 。
- java 所有类都是Object类的子类, Object是所有类的基类。
- 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)。
- 子类最多只能继承一个父类(指直接继承),即 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.属性没有重写之说!属性的值看编译类型