JavaSE 07 面向对象(上),javase07面向对象
JavaSE 07 面向对象(上),javase07面向对象
1、包
⑴ 包的好处
⑴ 类似于文件夹,实现了分类存储,方便管理和查找。
⑵ 允许在不同的包中,存在多个同名的Java文件。
⑵ 创建包
在类的上面添加包的声明语句:
语法: package 包名;
⑶ 包名的命名规则
只能包含字母、数字、下划线、美元符号、小圆点,不能以数字开头,不能是关键字或保留字。
⑷ 包名的命名规范
通过小圆点和小写的英文字母组成,采用域名倒置的写法
域名倒置: www.baidu.com → com.baidu
示例:com.公司名.部门名.项目名.模块名
⑸ 使用DOS编译和运行带有“package”关键字的Java文件
编译: 语法:javac -d . 文件名.java
运行:在 .java文件的目录下,语法:java 包名.类名
⑹ 包的使用
① 使用不同包中的类时,需要导包。
语法: import 包名.类名;(或: import 包名.*;)
② 一个类中可以导入多个包,对于顺序没有要求。
③ 在一个class文件中,最上面是package,接着是import,然后是class。
package 包名;
import 包名.类名;
public class 类名 {
}
④ 如果需要导入多个包下的同名类,则需要用包名.类名来创建对象。而不能导入多个同名类的包。
示例:com.test1.Person;
com.test2.Person;
这样是错误的!
应该为:
com.test1.Person p1 = new com.test1.Person();
com.test2.Person p2 = new com.test2.Person();
⑺ 静态导入
JDK5.0之后出现的新特性。
语法:iport static 包名.类名.*;
使用静态的属性或静态方法时,直接调用即可。
示例:import static java.lang.System.*;
out.println("Hello");
2、修饰符
⑴ 访问修饰符
可以用来修饰类的成员(属性和方法),还可以用来修饰类。
private 私有的 仅在本类中可以访问
默认(不写) 默认的 在本包的所有类中可以访问
protected 受保护的 在本包中的所有类中,以及其他包中的子类可以访问
public 公共的 任何包中的任何类都可以访问
按照访问范围:private < 默认 < protected < public
注意:只有默认和public 可以修饰类。
默认 只有本包中的其他类才能访问该类
public 任何包中的任何类都可以访问该类
3、封装
封装:属于面向对象的第一个特征。
生活中的封装(包裹打包):
隐藏了实际的物品,提高了安全性。
Java中的封装:
隐藏类内部的实现细节,提高了代码的安全性。
好处:避免属性的任意赋值,相当于提高了代码的安全性。
方法:隐藏了具体实现的细节。
类:隐藏了内部成员(属性、方法、构造器等)。
包:隐藏了包内的类。
封装的步骤:
⑴ 将属性私有化
语法:private 数据类型 属性名;
⑵ 提供一个公共的set方法,用于给属性赋值。
⑶ 提供一个公共的get方法,用于访问属性。
示例:private int age;
public void setAge(int age){
// 限制语句
}
public int getAge( ){
return age;
}
规范:所有的属性都进行私有化,对其提供公共的set和get方法。
封装的使用特点:
⑴ 如果属性是只写的,则只提供set方法。
⑵ 如果属性是只读的,则只提供get方法。
4、this关键字
作用:当全局变量(属性)和局部变量重名时,又想访问全局变量,因为局部变量遵循就近原则,所以需要使用this关键字来访问全局变量。
this:代表当前类的对象,谁调用this所在的方法,this就代表谁。
特点:this可以访问属性、方法和构造器。
语法:this.属性名 = 值; // 属性
this.方法名( );【一般不这样写】 // 方法
this( ); // 构造器
注意:
方法:每一个方法隐含了一个形参:当前类型 引用对象。
示例:
public class Test{
public void myMethod( ){ // 无参的方法
}
}
无参的函数:public void myMethod(Test this){ //隐含形参
}
构造器:⑴ 只能在构造器中调用this( )。
⑵ 通过this关键字调用的构造器,它只能放在构造函数体内的第一行。
应用场合:一般情况下,在本类中访问属性或方法时,没有必要加this关键字。而只有当方法体中的局部变量和类的属性(成员变量)重名时,或方法和其他类的方法重名时,才通过this关键字限定。
5、构造器【构造函数】
构造器又称构造函数,属于类的成员。
声明:
修饰符 构造器名(参数列表){
构造器体
}
注意:⑴ 构造器没有返回值。
⑵ 构造器的名字必须和当前类名一致。
调用:
没有形参列表的构造器:new 构造器名( );【new 类名( );】
有形参列表的构造器:new 构造器名(实参);
作用:
⑴ 创建对象
⑵ 通过自定义有形参列表的构造器,可以为属性赋值,减少代码量。
特点:
⑴ 如果一个类没有显式地(写出来)声明构造器,则系统将会默认提供一个无参的构造器(只不过我们看不到,但不代表它不存在)。
⑵ 如果一个类中已经声明了一个构造函数,不管它是有参的,还是无参的,系统都不会再提供一个无参的构造函数。
⑶ 一个类中支持多个构造函数的存在,但是这些构造函数的参数列表不能相同。类似与方法的重载。这就是构造器的重载。
6、引用数据类型作为参数【难点】
方法的形参的数据类型可以为基本数据类型,也可以为引用数据类型。其中引用数据类型包括类、接口和数组,这其中就包括我们自己自定义的类。
⑴ 创建方法
修饰符 返回值类型 方法名(自定义类型 名){
方法体;
}
⑵ 调用方法
① 创建对象:类名 对象名 = new 类名( );
给对象的属性赋值:对象名.属性名 = 值;
如果存在有参的构造函数可以写为:
类名 对象名 = new 类名(实参);
② 将对象传入方法:方法名(对象名);
注意特点:引用数据类型作为形参时,形参的改变会影响实参。
示例:
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.name = “张三”;
person.show(person);
System.out.println(person.name); // 李四
}
}
class Person {
String name;
public void show(Person p) {
p.name = “李四”;// 改变了形参的值,因为和实参共同引用同一块内存区域,所以也同时改变了实参的引用的区域的值。
}
}
备注:
⑴ 当调用people.showPerson( )方法时,会将创建出的person对象传递给showPerson( )方法。就是将person的地址值赋值给showPerson( )中的person。
⑵ 首先是打印出person的姓名,因为这时和创建出的对象是引用同一块区域,所以是main方法中赋值的“张三”。
⑶ 紧接着用局部变量,即showPerson(Person person)方法中的person,setName( )。即将共同引用的person的名字改为“李四”。
⑷ 因为已经改变了person在内存中的name,所以这时候再打印person的名字,就是“李四”。
⑸ showPerson( )方法执行完毕,返回main方法。因为在 ⑷ 中已经改变了person在内存中的name,所以这时候再打印person的name,就是“李四”。这就是引用数据类型作为形参时,形参的改变会影响实参。
⑹ 注意:如果调用的方法中,改变的不是形参的属性,而是改变了形参的引用。则这时形参的改变不会影响实参。
示例:
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.name = “张三”;
person.show(person);
System.out.println(person.name); // 张三
}
}
class Person {
String name;
public void show(Person p) {
Person person = new Person(); // 注意,这里创建了一个新的Person对象
p = person; // 将地址值给了形参p,即改变了形参的引用。
p.name = “李四”;
}
}
7、JavaBean
这是一个符合一定规范的类。
作用:为了和jsp交互使用。
规范:⑴ 必须具有get和set方法。⑵ 必须具有无参的构造器。 ⑶ 必须用public 修饰。
8、对象关联
一个对象又引用了另外一个对象。即一个类型的属性的类型是引用数据类型。
示例:
class Phone{
Phone的成员..
}
class Person{
String name;
int age;
Phone phone; // Person的一个属性是引用数据类型【Phone】
}
9、对象数组
数组的类型为引用数据类型。
示例:
public class Test {
public static void main(String[] args) {
Person[] persons = new Person[2];
Person p1 = new Person(“张三”, 17);
Person p2 = new Person(“李四”, 9);
persons[0] = p1;
persons[1] = p2;
for (int i = 0; i < persons.length; i++) {
System.out.println(persons[i].getInfo()); // 张三 17\n李四 9
}
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getInfo() {
return name + “\t” + age;
}
}
内存图:
相关文章
- 暂无相关文章
用户点评