java基础第九篇之final和内部类等

final关键字:final:最终,终极java

 

final:做用:修饰类,变量,方法、成员变量的访问ide

1.final修饰变量:操作系统

    final修饰局部变量:对象

把这个局部变量 变成一个厂里,这个厂里只能被赋值一次继承

final修饰成员变量:接口

要求这个成员变量 在建立对象以前必须初始化生命周期

因此final修饰的成员变量 第一直觉赋值 第二构造方法赋值内存

可是也只能赋值一次作用域

 

2.final修饰的类:(太监类) ,不能被子类继承(String)开发

    final修饰的方法:(子类不能重写)

 

静态代码块:一般写到成员位置

 *   static {代码}

静态成员变量优先于静态代码块执行,优先于构造方法执行,优先于main方法执行

 *

 * 特色1.在同一个类中 静态代码块是优先于构造方法执行,静态代码块优先于main方法

 * 并且只会执行一次,第一次使用到(多是建立对象,也多是调用对象的静态成员)这个类就是会执行

 

 在jdk1.7版本中局部内部类访问局部变量必须用final修饰.

由于当调用这个方法时,局部变量若是没有用final修饰,他的生命周期和方法的生命周期是同样的,当方法弹栈,这个局部变量也会消失,那么若是局部内部类对象尚未立刻消失

想用这个局部变量,就没有了,若是用final修饰会在类的加载的时候进入常量池,即便方法弹栈,常量池的常量还在,也能够继续使用.

 

可是在jdk1.8取消了这个事情,因此我认为是个bug;

 

Student s = new Student()

 

作了哪些事情

1.Student.class加载进内存.

2.声明一个Student类型引用.

3.在堆内存建立对象.

4.给对象中属性默认初始化值

5.属性进行显示初始化

6.构造方法进栈,对对象中的属性赋值,构造方法弹栈

7.将对象的地址值赋值给s

 

 

class Fu {

static {

syso("A");

}

 

{

syso("B")

}

 

public Fu() {

syso("C")

}

 

 

}

class Zi extends Fu{

static {

syso("AA");

}

 

{

syso("BB")

}

 

public Zu() {

syso("CC")

}

 

}

class Test {

main {

Zi z = new Zi();

}

}

 

1.Jvm调用了main方法,main进栈

2.遇到Zi z = new Zi();会将Fu.class和zi.class分别加载进内存,再建立对象,当Fu.class加载进内存

父类的静态代码块会随着u.class一块儿加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一块儿加载

第一输出父类静态,第二输出子类静态

3.走Zi类的构造方法,由于java中分层初始化,先初始化父类,在初始化子类,全部先走父类构造,可是在执行

父类构造时,发现父类有构造代码块,构造代码块就优先于构造方法执行,因此abstract不能和private,

第三个输出构造代码块Fu,第四个构造方法Fu

4.Fu类初始化结束,子类进行初始化,第五个输出构造代码块zI,构造方法Zi

 

 

1.包:就是文件夹,管理.java文件的,管理.class文件。

 

2.包:以"."分割每个单纯,每个单纯表明一个文件夹

实际开发中:包的写法通常是公司的域名倒过来写

 

3.全限定类名: 包名.类名

    例如:cn.baidu.demo03.PackageDemo

 

4.导包的关键字 import

4.1先导包 import java.util.Scanner;

4.2Scanner sc = new Scanner(System.in);

 

在java中有四种权限修饰符:

 

权限从大到小 以此为:

    public(公共的) protected(受保护的) default(默认的) private(私有的)

 

1.public修饰 在哪里均可以用(在本包中或者在其余包中均可以用)

2.private修饰 只能在本包中的本类中可使用

 

protected(受保护的) default(默认的)

 

共同点:这两个修饰的成员只能在本包中使用

不一样点:protected修饰的成员的,不一样包的子类中也可使用

 

内部类:

    在第一个类的内部 再定义第二个类,那么第二个类称为内部类 第一个类称为外部类

 

根据内部类定义的位置不一样

那么能够分红:

 

局部内部类:定义类在方法的里面,开发历来不用.

成员内部类:定义类的外部类的成员位置

建立成员内部类对象的格式:

外部类名.内部类名 变量名 = new 外部类().new 内部类();

 

成员内部类的做用:

成员内部类能够无条件访问外部类的任何成员.

 

匿名内部类: 一种语法格式,用来快速建立抽象类的子类或者接口的实现类对象

 *

 * 1.建立一个抽象类

 * 2.用一个子类继承抽象类

 * 3.建立子类的对象

 

  //dd.eat();

//匿名内部类的第一种写法

new Animal(){

@Override

public void eat() {

// TODO Auto-generated method stub

System.out.println("未知的动物在吃shi");

}

};

//匿名内部类的第二种格式

Animal an = new Animal(){

@Override

public void eat() {

System.out.println("未知的动物在吃shi");

}

};

//匿名内部类的第三种格式

new Animal(){

@Override

public void eat() {

System.out.println("未知的动物在吃粑粑");

}

}.eat();

//用匿名内部类建立接口的实现类对象

NYInterface nvyou = new NYInterface(){

 

@Override

public void cook() {

// TODO Auto-generated method stub

System.out.println("未知的女朋友在给你作饭");

}

 

 

};

 

nvyou.cook();

 

1.类能够做为方法的参数和返回值,咱们须要是这个类的对象

 *

 * 2.抽象类也能够做为方法的参数和返回值,咱们须要的抽象类子类的对象

 *

 * 3.接口也能够做为方法的参数和返回值,咱们须要的接口的实现类对象

 

 2. static 方法与普通方法有什么区别?

static 方法在内存中只有一份,普通方法在每一个被调用中维持一份拷贝,

static方法属于类方法随着类的加载而加载!普通方法属于对象随着对象

的建立而存在随着对象的消失而消失。

 

3.是否能够在static环境中访问非static变量?

答:static变量在java中是属于类的,它在全部实例中的值都是同样的。

当java虚拟机载入的时候会对static变量进行初始化。若是你的代码尝

试不用实例来访问非static的变量,编译器会报错,由于这些变量还没

有被建立出来,尚未和任何实例关联上。

 

4.使用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容仍是能够改变的。

请说出做用域public,private,protected,以及不写时的区别?

这四个做用域的可见范围以下表所示。

说明:若是在修饰的元素上面没有写任何访问修饰符,则表示空的(default)。

做用域 当前类同一package子孙类其余package

public √ √ √ √

protected √ √ √ ×

default√ √ × ×

private √ × × ×

 

建立内部类的时候先建立了外部类对象而后才建立内部类对象

 

抽象类要让子类继承并重写抽象方法,使用private修饰便不能被继承和重写,使用final修饰也不能被重写,

使用static修饰,能够类名直接调用方法,但抽象方法没有主体调用无心义,因此abstract不能和private,

final,static共用

 

修饰类只能使用public、final、abstract关键字,A、B错;

(2)abstract不能与private、static、final共用,C、D错;

(3)接口中只有常量和抽象方法,常量修饰符为public static  final,F错。

本题主要考查对不一样修饰符的理解以及它们之间互相组合来使用的注意事项。

 

 

abstract不能和那些关键字共存:

 

1:private:由于一个abstract方法须要被重写,因此不能修饰为private;

 

2:final:由于一个abstract方法须要被重写.被final修饰的方法不能被重写的,因此不能同final共存;

 

3:static:由于一个abstract方法没有方法体.静态方法须要对方法体执行内容分配空间,因此不能同static共存;

(abstract是没有实现的,不能产生对象,而是static是属于类的,类自己是已经存在的对象)

 

4:synchronized:是同步的,然而同步须要具体的操做才能同步,但,abstract是只有声明没有实现的(既,使用synchronized关键字的是须要有具体的实现

同步的操做的,可是使用abstract时只有声明而没有实现的,这样就产生了冲突)

 

5:native:他们自己的定义就是冲突的,native声明的方法时移交本地操做系统实现的,而abstract是移交子类对象实现的,同时修饰的话,致使不知道谁实现声明的方法.

 

为何构造方法不能被继承?

    能够这样理解构造器,构造器就是用来创造对象诞生的。说的形象的就是,你爸和你妈有一个构造器,才会形成你的出现。你爷和你奶也有个构造器,才会形成你爸的出现

。 要是构造器能继承的话,那你爸和你妈能够没有本身的构造器。那这样你就能够直接从你爷爷和你奶奶的构造器出来了。这不就形成你和你爸,的诞生没有次序了嘛?

ClassCastException:  类型转换错误

相关文章
相关标签/搜索