JavaSE 07 面向对象(上)

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;
  }
}

内存图:
对象数组内存图

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值