java——面向对象篇(一)
文章目录
1.面向过程和面向对象的区别
简单来说:
面向过程(Procedure Oriented):是一种以过程为中心的编程思想,强调的是功能行为,以函数为最小单位,考虑怎么做。
面向对象(Object Oriented):将功能封装进对象, 强调具备了功能 的 对象,以类对象为最小单位,考虑谁来做。
2.Java语言的基本元素:类和对象
类(Class) 和 对象(Object) 都是面向对象的核心概念。
- 类:是对一类事物的描述,是抽象的、概念上的东西。
- 对象:是实际存在的该类事物的每个个体,是类实例化的,因此也称为实例。
万事万物皆为对象
比如,用人来举例:
类 = 抽象概念的人;
对象 = 实实在在的人(例:马云、马化腾…)
2.1 Java类及类的成员
- 属性:对应类中的成员变量
- 行为:对应类中的成员方法
不同语言有不同的命名,比如C++中称方法为函数
2.1.1 成员变量
成员变量的定义与普通变量的定义一样。
数据类型 | 默认值 |
---|---|
byte、short、int、long | 0(整形零) |
float、double | 0.0(浮点零) |
char | ’ ’ (空格字符) |
boolen | false(逻辑假) |
引用类型,例如String、数组 | null(空值) |
2.1.2成员方法
方法的定义
[权限修饰符] [返回值类型] 方法名([参数类型 参数名]){
…}
权限修饰符可以是private、public、protected
比如:在这个类中name、age、isMarried是属性,walk()是方法。
public class Person {
String name;
int age;
int Ismale;
public void eat() {
System.out.println("我会吃饭");
}
public void Showage() {
System.out.println("我的年龄是"+age);
}
}
可变个数形参的方法:
- 可变个数形参的格式:数据类型…变量名
例:person类中的showfriends方法
public void showfriends(String...name) { System.out.println("我的朋友有好多朋友!!!"); }
- 当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个…
例:person.showfriends("friend1","friend2"); person.showfriends("friend1","friend2","frident3");
- 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
例:
public void showfriends(String...name) {
System.out.println("我的朋友有好多朋友!!!");
}
public void showfriends(String name) {
System.out.println("我的朋友有一个朋友!!!");
}
- 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。换句话说,二者不能共存
如果是这种情况,这里报错了
- 可变个数形参在方法的形参中,必须声明在未尾
说明:String name 一定要在int i 之后
public void showfriends(int i,String...name ) {
System.out.println("我的朋友有好多朋友!!!");
}
- 可变个数形参在方法的形参中,最多只能声明一个可变形参。
2.2.创建Java自定义类
步骤:
1.定义类(考虑修饰符、类名)
2.编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
3.编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
类的语法格式
修饰符 class 类名{
属性声明;
方法声明;
}
3.对象的创建和使用
- 创建对象语法:类名对象名=new类名();
- 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
例如,对上面的人创建对象。这里我们创建了新的类来测试
public class PersonTest {
public static void main(String[] args) {
Person person = new Person();//创建对象
person.name = "李四";//访问属性
person.age = 21;
person.eat();//访问方法
person.Showage();
}
}
结果如下:
说明:如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰。
3.1 内存解析
堆(heap): 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存 。 一点在Java 虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。(简单的说就是new出来的东西)。
栈(stack): 通常所说的 栈 Stack 是指虚拟机栈 。 虚拟机栈用于 存储 局部变量 等 。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)。
比如看这个代码:
Person p1 = new Person();
p1.name = "Tom";
p1.isMale = true
Person p2 = new Person();
System.out.println(p2.name);//null
Person p3 = p1
p3.age = 10;
3.2 匿名对象
我们可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。
例:new Person().showfriend()
4.面向对象程序设计的特点
面向对象程序具有以下特点:
- 封装性
- 继承性
- 多态性
4.1封装
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常会对客户隐藏其实现细节,这就是封装的思想。
例如:一台笔记本电脑,我们不需要了解笔记本内部是如何工作的,我们只需要手指敲键盘就好了,就能实现一些功能了。
4.2 继承
继承是实现重复利用的重要手段,子类通过,复用父类属性和行为的同时又添加了字类特有的属性和行为。
例如:
矩形,菱形,平行四边形和梯形都是四边形。
5.构造器
构造器的作用:
创建对象
初始化
1.如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器
这里我们没有,显示定义构造器,但系统默认提供了一个构造器,类似于
在Person类中添加了
public Person() {
}
package contain;
public class Person_1 {
public static void main(String[] args) {
//创建类的对象:new + 构造器
Person tom = new Person();
}
}
class Person {
String name;
int age;
int Ismale;
public void eat() {
System.out.println("我会吃饭");
}
public void Showage() {
System.out.println("我的年龄是"+age);
}
}
2.定义构造器的格式:权限修饰符类名(形参列表){}
class Person {
String name;
int age;
int Ismale;
//定义构造器的格式:权限修饰符类名(形参列表){}
public Person(int age,String name) {
this.age = age;
this.name = name;
}
public void eat() {
System.out.println("我会吃饭");
}
public void Showage() {
System.out.println("我的年龄是"+age);
}
}
3.一个类中定义的多个构造器,彼此构成重载
public Person(int age,String name) {
this.age = age;
this.name = name;
}
public Person(int age) {
this.age = age;
}
说明:一旦我们显式的定义了类的构造器之后,系统就不在提供默认的空参构造器
6. this 关键字
this关键字的使用:
1.this可以用来修饰:属性、方法、构造器
2.this修饰属性和方法:
this理解为:当前对象
7.package的使用
- package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:
package顶层包名.子包名 - ·包对应于文件系统的目录,package语句中,用“.”来指明包(目录)的层次;
- JDK中主要的包介绍
1.java.lang----包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能
2.java.net----包含执行与网络相关的操作的类和接口。
3.java.io—包含能提供多种输入/输出功能的类。
4.java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
5.java.text----包含了一些java格式化相关的类6.java.sql----包含了java进行JDBC数据库编程的相关类/接口
7.java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
8.import
1.在源文件中显式的使用import结构导入指定包下的类、接口
2.声明在包的声明和类的声明之间
3.如果需要导入多个结构,则并列写出即可
4.可以使用“xxx.*”的方式,表示可以导入XXX包下的所有结构
5.如果使用的类或接口是java.lang包下定义的,则可以省略import结构
6.如果使用的类或接口是本包下定义的,则可以省略import结构7.如果在源文件中,使用了不同包下的同名的类,则必须至少有一个类需要以全类名的方式显示。
8.使用"xxx。*“方式表明可以调用XXX包下的所有结构。但是如果使用的是XXX子包下的结构,则仍需要显示导入
9.import static:导入指定类或接口中的静态结构:属性或方法