运行:在 .java文件的目录下,语法:java 包名.类名
private 私有的 仅在本类中可以访问 默认(不写) 默认的 在本包的所有类中可以访问 protected 受保护的 在本包中的所有类中,以及其他包中的子类可以访问 public 公共的 任何包中的任何类都可以访问
按照访问范围:private < 默认 < protected < public
注意:只有默认和public 可以修饰类。 默认 只有本包中的其他类才能访问该类 public 任何包中的任何类都可以访问该类
封装:属于面向对象的第一个特征。
生活中的封装(包裹打包): 隐藏了实际的物品,提高了安全性。 Java中的封装: 隐藏类内部的实现细节,提高了代码的安全性。 好处:避免属性的任意赋值,相当于提高了代码的安全性。
方法:隐藏了具体实现的细节。 类:隐藏了内部成员(属性、方法、构造器等)。 包:隐藏了包内的类。封装的步骤: ⑴ 将属性私有化 语法:private 数据类型 属性名; ⑵ 提供一个公共的set方法,用于给属性赋值。 ⑶ 提供一个公共的get方法,用于访问属性。
示例:private int age; public void setAge(int age){ // 限制语句 } public int getAge( ){ return age; }
规范:所有的属性都进行私有化,对其提供公共的set和get方法。
封装的使用特点: ⑴ 如果属性是只写的,则只提供set方法。 ⑵ 如果属性是只读的,则只提供get方法。
作用:当全局变量(属性)和局部变量重名时,又想访问全局变量,因为局部变量遵循就近原则,所以需要使用this关键字来访问全局变量。 this:代表当前类的对象,谁调用this所在的方法,this就代表谁。
特点:this可以访问属性、方法和构造器。语法:this.属性名 = 值; // 属性 this.方法名( );【一般不这样写】 // 方法 this( ); // 构造器 注意: 方法:每一个方法隐含了一个形参:当前类型 引用对象。 示例: public class Test{ public void myMethod( ){ // 无参的方法 } }
无参的函数:public void myMethod(Test this){ //隐含形参 }
构造器:⑴ 只能在构造器中调用this( )。 ⑵ 通过this关键字调用的构造器,它只能放在构造函数体内的第一行。
应用场合:一般情况下,在本类中访问属性或方法时,没有必要加this关键字。而只有当方法体中的局部变量和类的属性(成员变量)重名时,或方法和其他类的方法重名时,才通过this关键字限定。
构造器又称构造函数,属于类的成员。
声明: 修饰符 构造器名(参数列表){ 构造器体 } 注意:⑴ 构造器没有返回值。 ⑵ 构造器的名字必须和当前类名一致。
调用: 没有形参列表的构造器:new 构造器名( );【new 类名( );】 有形参列表的构造器:new 构造器名(实参);
作用: ⑴ 创建对象 ⑵ 通过自定义有形参列表的构造器,可以为属性赋值,减少代码量。
特点: ⑴ 如果一个类没有显式地(写出来)声明构造器,则系统将会默认提供一个无参的构造器(只不过我们看不到,但不代表它不存在)。 ⑵ 如果一个类中已经声明了一个构造函数,不管它是有参的,还是无参的,系统都不会再提供一个无参的构造函数。 ⑶ 一个类中支持多个构造函数的存在,但是这些构造函数的参数列表不能相同。类似与方法的重载。这就是构造器的重载。
方法的形参的数据类型可以为基本数据类型,也可以为引用数据类型。其中引用数据类型包括类、接口和数组,这其中就包括我们自己自定义的类。
⑴ 创建方法 修饰符 返回值类型 方法名(自定义类型 名){ 方法体; } ⑵ 调用方法 ① 创建对象:类名 对象名 = 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 = “李四”; }
}
这是一个符合一定规范的类。 作用:为了和jsp交互使用。
规范:⑴ 必须具有get和set方法。⑵ 必须具有无参的构造器。 ⑶ 必须用public 修饰。
一个对象又引用了另外一个对象。即一个类型的属性的类型是引用数据类型。
示例: class Phone{ Phone的成员.. }
class Person{ String name; int age; Phone phone; // Person的一个属性是引用数据类型【Phone】 }
数组的类型为引用数据类型。
示例: 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; } }
内存图: