您的位置:首页 > 编程语言 > Java开发

Java基础学习8_封装

2016-01-25 18:05 357 查看
面向对象三大特性:

封装,继承,多态

一、什么是Java中的封装

1、概念:

将类的某些信息隐藏在类内部,不允许外部程序直接访问和修改,而是通过该类提供的方法来实现对隐藏信息的操作和访问

2、好处:

(1)只能通过规定的方法访问数据

(2)隐藏类的的实例细节,方便修改和实现。更关注类怎么用,而不是怎么实现。

3、封装的实现步骤

(1)修改属性的可见性:属性前面加上一个修饰符private

(2)创建getter/setter方法:指定一个特定的方法来访问我们的属性,通常这种方法我们称为getter/setter方法,其目的是用于属性的读写(不一定使用此方法,此方法为编程规范)

(3)在getter/setter方法中加入属性控制语句,对属性值的合法性进行判断。

二、使用包管理Java中的类

1、包的作用:管理Java文件;解决同名文件冲突(类似于文件夹,不同文件夹放置不同的文件;使用不同的包来区分相同文件名的类);

2、定义包:package 包名

注意:必须放在Java源程序的第一行;包名间可以使用“.”号隔开,如com.mooc.MyClass

例如:音乐类——MyClassMusic 类名相同,通过包名进行区分

-music com.imooc.music.MyClassMusic

-movie com.imooc.muic.MyClassMusic

3、系统中的包

java.(功能).(类)

java.lang.(类) 包含java语言基础的类

java.util.(类) 包含java语言中各个工具类

java.io.(类) 包含输入、输出相关功能的类

4、包的使用

(1)可以通过import关键字,在某个文件使用其他文件中的类。

import com.imooc.music.Myclass

(2)Java中,包的命名规范是全小写字母拼写(编程规范非强制要求)

(3)使用的时候不但可以加载某个包下的所有文件,也可以加载某个具体子包下的所有文件: com.imooc.* // com.imooc.music.*

三、Java中的访问修饰符

1、访问修饰符——可以修饰属性和方法的访问范围

2、访问修饰符的使用范围:(修饰属性和方法)

(1)private:本类

(2)默认(缺省):本类;同包

(3)protected:本类;同包;子类

(4)public:本类;同包;子类;其他(任意位置)

四、Java中的this关键字

1、this关键字的作用:代表当前对象

this.属性 操作当前对象的属性

this.方法 调用当前对象的方法

2、封装对象的属性时,经常会使用this关键字

五、什么是Java中的内部类

内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。

内部类的主要作用如下:

1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类

2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据

3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便

例:

运行结果:

内部类可分为以下几种:

1、成员内部类

2、静态内部类

3、方法内部类

4、匿名内部类

六、Java中的成员内部类

成员内部类的使用方法:

1、 Inner 类定义在 Outer 类的内部,相当于Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如

public 、 protected 、 private 等.

2、 Inner 类中定义的方法可以直接访问Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中

的私有属性。

3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类

对象名 = 外部类对象.new 内部类( );

4、 编译上面的程序后,会发现产生了两个.class 文件



例:



运行结果:


注:

1、 外部类是不能直接使用内部类的成员和方法



可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。

2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用this 关键字。如:



运行结果:


例:

//外部类HelloWorld
public class HelloWorld{

//外部类的私有属性name
private String name = "imooc";

//外部类的成员属性
int age = 20;

//成员内部类Inner
public class Inner {
String name = "爱慕课";
//内部类中的方法
public void show() {
System.out.println("外部类中的name:" +HelloWorld.this.name);
System.out.println("内部类中的name:" +name);
System.out.println("外部类中的age:" + age);
}
}

//测试成员内部类
public static void main(String[] args) {

//创建外部类的对象
HelloWorld o = new HelloWorld ();

//创建内部类的对象
Inner inn = o.new Inner();

//调用内部类对象的show方法
inn.show();
}
}
输出结果:

外部类中的name:imooc
内部类中的name:爱慕课
外部类中的age:20


七、Java中的静态内部类

静态内部类是 static 修饰的内部类,这种内部类的特点是:

1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问

2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员

3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();



运行结果:


八、Java中的方法内部类

方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。



注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。

九、Java中的匿名内部类(自行整理)

匿名内部类就是内部类的简写格式,使用内部类必须有前提:内部类必须继承或者实现一个外部类或者接口

匿名内部类:其实就是一个匿名子类对象

语法 new 匿名内部类的父类名(){子类内容}

子类内容中如果有方法的覆盖,方法的访问修饰符必须是public

如果匿名内部类中有多个成员需要调用, 可以新建个父类类型的引用变量来保存匿名内部类,然后通过引用型变量来访问匿名内部类中的成员

使用变量访问的只是父类中也有的成员(即多态结合匿名内部类)

匿名内部类

作者:codersai

源自:/article/5253764.html

匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。下面这段代码是一段Android事件监听代码:
scan_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}
});

history_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}
});


这段代码为两个按钮设置监听器,这里面就使用了匿名内部类。具体位置是这段:
new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}
}


代码中需要给按钮设置监听器对象,使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。当然像下面这种写法也是可以的,跟上面使用匿名内部类达到效果相同:
private void setListener()
{
scan_bt.setOnClickListener(new Listener1());
history_bt.setOnClickListener(new Listener2());
}

class Listener1 implements View.OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}
}

class Listener2 implements View.OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}
}


这种写法虽然能达到一样的效果,但是既冗长又难以维护,所以一般使用匿名内部类的方法来编写事件监听代码。同样的,匿名内部类也是不能有访问修饰符和static修饰符的。

匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为
Outter$1.class
。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: