6 面向对象之类和对象
1 面向对象和面向过程的区别
两者都是软件开发思想,先有面向过程,后有面向对象。在大型项目中,针对面向过程的不足推出了面向对象开发思想。
区别:
1)编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。
2)封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
3)面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势是明显。
2 类和对象
对象:客观存在的实体(一个具体的事物)。
类:具有相同特征和共同行为对象的集合。是人类脑海中一个抽象的概念,代表的是一种"共性".
类中的成员:1.成员属性(描述外部特征) 2.成员方法(描述功能行为)
3 定义和访问类
1)定义一个类:
[修饰符] class 类名{
//1.属性的定义:与定义变量类似
[修饰符] 数据类型 属性名;
//2.方法的定义
[修饰符] 返回值类型 方法名(形参列表){
//方法体;
}
}
2)访问类中成员
a.访问属性:
创建对象(创建实例):类名 对象名 = new 类名();
赋值: 对象名.属性=值;
属性(成员变量):作用域范围是在整个类体.
b.调用方法
静态方法(使用static修饰的方法):类名.方法名()
普通方法(非static修饰的方法):对象名.方法名();
4 变量的作用域
变量声明的位置不同会导致其作用域不同。
局部变量:在方法内部声明的变量,其作用域仅限于当前方法使用。
成员变量:在类中声明的属性,其作用域可以在当前类中使用。
区别:
1.作用域不同:成员变量的作用域是在整个类体,局部变量的作用域在当前方法
2.是否有默认初始值:成员变量是有默认的初始值,局部变量没有默认初始值。
eg:int类型默认初始值为0 double类型默认初始值为0.0 boolean类型默认为false String默认为null
3.是否能使用修饰符(public/private/protected/默认):成员变量:可以添加public等修饰符,局部变量不能。
4.在内存中保存的位置不同:成员变量保存到堆中,局部变量保存到栈。
5构造方法
构造方法(构造器):是一种特殊的方法,主要用于为成员变量初始化(为成员变量赋初始值)。
特征:
1.方法名必须与类名相同。
2.没有返回值类型。void也是一种返回值类型。
构造的作用:为成员变量赋初始化值。
语法: [修饰符] 类名([形参列表]){
}
构造方法使用new关键字进行调用。
如果没有显式定义构造方法,虚拟机会自动添加无参构造,但是一旦显式定义了构造方法,虚拟机在编译时将不同添加无参构造(默认无参构造失效),如果需要调用无参构造就必须自己定义。
构造方法是可以重载(方法名相同,参数列表不同)。
6 this关键字
this关键字:代表当前对象本身
1)用于区分成员变量和局部变量。
2)可以使用this访问当前对象的成员变量和成员方法(可以使用this调用属性和方法) this.方法名()或this.属性
3)可以使用this调用构造方法,必须作为构造方法的第一行语句。
public Dog(String name,String bland,int age){
this.name=name;
this.bland=bland;
this.age=age;
}
public void test(){
}
this.name ;访问属性
this.test(); 调用方法
7 值传递和引用传递
数据类型可以分为基本数据类型和引用数据类型
如果将基本类型作为方法参数属于值传递:方法执行结束后不会保留执行结果。
如果将引用数据类型作为方法参数,属于引用传递,方法执行结束后会保留执行结果。
8 内存结构
1)栈
在方法中声明的局部变量保存在栈中,方法执行结束后栈中数据会被回收
2)堆
堆中保存的是对象的信息,使用new关键字创建的对象信息。堆中信息会被java的垃圾回收器回收。
3)方法区
保存的是类的信息(代码)、静态(static)变量、字符串常量等。
9 static关键字
1)static修饰的变量为静态变量,类变量
访问方式: 类名.变量名(推荐) 对象名.变量名
①成员变量和全局变量的区别:
a.在计算机内存中保存的位置不同:
成员变量保存在堆中,全局变量保存在方法区
b.保存的份数不同
成员变量每new一次都开辟空间,保存多份。
全局变量只有1份
c.访问方式不同
成员变量: 对象名.属性,可以使用this关键字。
全局变量: 类名.属性(推荐) 对象名.属性
d.创建时间不同:
成员变量:只有使用new关键字创建对象时才会在堆中为其分配空间
全局变量:在类加载时在方法区中分配空间。
2)使用static关键字可以修饰方法:静态方法或类方法
特点:静态方法中无法访问非静态的成员变量或方法;但非静态的方法中是可以访问静态的成员
访问方式: 类名.方法名(推荐) 对象名.方法名
3)使用static修饰代码块,静态代码块
语法:static{
//代码
}
执行过程:在类加载时执行静态代码块。静态代码块>普通代码块>构造方法。只会执行1次。
代码块:使用花括号包含的代码。使用比较少。不需要显式调用。
代码块的执行顺序:在创建实例时执行。代码块在构造方法之前执行,并且按照顺序执行,每创建一个对象就会执行1次。执行多次。
类中代码的执行顺序: 静态代码块>代码块>构造方法>静态方法或实例方法。
静态的方法中只能访问静态变量, 非静态的方法可以访问静态或非静态的变量
10 package和import关键字
1)package关键字主要用于声明包。
java中的包:类似文件夹
作用:1.分门别类进行存放数据,方便分类和管理。2.避免命名冲突。
包的命名规范:所有字母都是小写,多级包名之间利用.进行分割
java中常见的包: java.lang包之外的其他包下的类,使用时需要导包。
* java.lang包:java核心类库,String,System,Math... 该包下的类可以直接使用,无需导包。
* java.util包:工具类。 Arrays,Scanner...
* java.io包:i(input)/o(output)和java中流的输入和输出相关的类库。
* java.net包:网络编程相关的类库。
* java.sql包:与数据库操作相关的类库。
* java.text包:国际化或格式化输出相关的类库。
* java.awt包/javax.swing包:图形化界面相关的类库
* 声明包:使用package关键字,必须放在该类的第一行。
* 语法: package 包名; eg:cn.zzsxt.oop7;
2)导入包: import关键字,在使用非当前包下的其他包下的类时需要导包
方式一: import 包名.*;将整个包导入。 eg: import cn.zzsxt.oop6.*;
方式二(推荐): import 包名.类名; eg:import cn.zzsxt.oop6.TestStatic;
*直接使用全类名进行访问: 包名.类名;
cn.zzsxt.oop6.TestStatic testStatic = new cn.zzsxt.oop6.TestStatic();
*特殊场景:不同的包下存在相同的类名。
import java.util.*;
import java.sql.*;
java.util.Date date = new java.util.Date();
3)静态导入
package cn.zzsxt.oop7;
import static java.lang.Math.*;
import static java.lang.Math.PI;
import static java.lang.Math.random;
静态导入:JDK1.5之后的新增特性。
语法: import static 包名.类名;
作用:如果使用静态导入某个类或类中属性和方法,可以直接使用该类中的静态属性或静态方法。
System.out.println(Math.PI);
double rand = Math.random();
System.out.println(rand);
System.out.println(PI);//使用java.lang.Math类中的静态属性
System.out.println(random());//使用java.lang.Math中的静态方法
}