内部类,final----java内部类基础,为GUI打基础

来源:互联网 发布:如何申请淘宝网开店 编辑:程序博客网 时间:2024/06/05 21:57

------- android培训、java培训、期待与您交流! ----------

内部类:用来高级封装数据
1把类定义在另一个类的内部,该类就被称为内部类。
举例:把类B定义在类A中,类B就被称为内部类。
2内部类的访问规则
1可以直接访问外部类的成员,包括私有
2外部类要想访问内部类成员,必须创建对象
3内部类的分类
1成员内部类,和成员变量,方法同级
2局部内部类,类被定义在方法中
4成员内部类
1private 为了数据的安全性
2static 为了访问的方便性,也叫静态内部类
成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();

5局部内部类:将类定义在方法的内部
1局部内部类访问局部变量必须加final修饰。
2为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
6匿名内部类
1是局部内部类的简化形式
2前提
存在一个类或者接口
3格式:
new 类名或者接口名() {
重写方法;
}
4本质:
其实是继承该类或者实现接口的子类匿名对象
5匿名内部类在开发中的使用
当看到方法的参数抽象类,或者接口。
而这个时候,我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。

   练习1

class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num  = 30;

//访问内部类局部变量
System.out.println(num);

//访问内部类的成员
System.out.println(this.num);

//访问外部类的成员格式
System.out.println(Outer.this.num);}}}

public static void main(Stromg [] args){

//创建对象的格式

Outer.Inner d=new Outer().new Inner();
d.show();}
结果:30,20,10
练习2,实现课堂匿名内部类:

interface Person {

public abstract void study();}

class PersonDemo {

//方法的参数是一个接口类型,没有给出接口的实现类
public void method(Person p) {
p.study();}}
class PersonTest {
public static void main(String[] args) {
PersonDemo pd = new PersonDemo();
pd.method(

//直接new接口,匿名内部类

new Person() {
public void study() {
System.out.println("我要去黑马,我要努力");
}
});
}
}

练习3:匿名内部类的面试题(补齐代码)

class OuterDemo {
public static void main(String[] args) {

//根据这个补齐代码
Outer.method().show(); //"HelloWorld"
}
}

//分析,方法只能用对象来调用,可以通过类名直接访问方法时,方法为静态的;
interface Inter {
void show();
}
class Outer {
//静态方法
public static Inter method() {
return new Inter() {//返回一个匿名类重写show()方法
public void show() {
System.out.println("HelloWorld");
 }}}}

final关键字:修饰类,成员变量,局部变量 ,方法,切只可以显示的赋值一次,赋值之后值不可以改变(基本类型和引用类型分别是什么值)
 来源:用于完善封装,因为继承打破了封装的安全性
    重点:局部内部类方法局部成员变量时,要将局部变量修饰称final的

举例:总结归纳了final修饰的五个常用的地方

public final class FinalDic {1//类不能被继承

2//自定义常量,注意常量的书写格式
private  static final String XIAO_MA="heima";
3//这里的fianl修饰的是fd这个引用,意思是在占内存中的地址值不变,即fd=0x0025
private static final FinalDic fd=new FinalDic();
4//表示子类不能修改这个方法,但是子类有这个方法的信息
private final void  show(){

}
public  void setName(final String name){
5 //final修饰的形参不能在方法内部改变值,否则编译不通过
//name="sdfs";
}}

总结:

1个人理解:因为一个方法在一个类中只能访问本类的方法和成员变量,也就是说,他们只用是平级的关系才可以访问,而我们为了简便,将实现一个接口直接在本类中,此时叫做匿名内部类对象的方法,再将这个放在方法的参数上时就可以直接调用了,所以叫做匿名内部类;

2访问内部类时必须先要有外类的对象来,因为他是一个成员,只不过引用变成了“外部类.内部类”

3fianl修饰的是自定义类型引用,意思是在占内存中的地址值不变,

0 0
原创粉丝点击