代码块
代码块分为普通代码块、构造块、静态块、同步块。
普通代码块:即一个简单的{}
构造块:构造块写在类之中,并且优先于构造方法执行,而且每当有对象实例化产生时都要执行构造块,会进行重复调用,但一般尽量不去使用。
静态块:静态块是使用static关键字声明的代码块,使用时分两种情况 一种是定义在普通类之中,另一种是在主类之中。并且优先于构造块执行,不管有多少个实例化对象,静态块只执一次
内部类
一.内部类的基本概念
所谓内部类就是在一个类的内部定义了类的结构形成的代码形式 如下代码:
class Outer { //外部类
private String msg = "Hello World!";
class Inter{ //内部类
public void print(){
System.out.println(Outer.this.msg);
}
}
public void fun(){
new Inter().print();
}
}
public class TextDemo10{
public static void main(String[] args) {
Outer out = new Outer();
out.fun();
}
}
内部类的缺点:类的结构应该是属性和方法两个部分,但是多了一个类,这样内部类就破坏了程序
优点:可以方便访问外部类之中定义的私有成员,同理 外部类可以方便的访问内部类的私有成员
其中内部类调用外部类时使用“外部类名.this.属性”
外部类访问内部类私有成员实例
class Outer { //外部类
private String msg = "Hello World!";
class Inter{ //内部类
private int num = 100;//内部类私有成员
public void print(){
System.out.println(Outer.this.msg);
}
}
public void fun(){
Inter in = new Inter();
in.print();
System.out.println(in.num);//内部类私有
}
}
public class TextDemo10{
public static void main(String[] args) {
Outer out = new Outer();
out.fun();
}
}
以上代码中内部类最终都在外部类的方法中操作,那么Java中内部类也可以直接由主方法调用语法为:“外部类.内部类 内部类对象 = new 外部类().new 内部类();” 例
class Outer { //外部类
private String msg = "Hello World!";
class Inter{ //内部类
public void print(){
System.out.println(Outer.this.msg);
}
}
}
public class TextDemo10{
public static void main(String[] args) {
Outer.Inter in = new Outer().new Inter();
in.print();
}
}
如果一个内部类不想在外使用,那么就可以使用关键字private声明
二.使用static定义内部类
如果说现在一个内部类不希望受到外部类中属性的控制,而可以去直接实例化对象,那么在定义内部类的时候可以使用关键字static声明,此时的内部类严格上就是一个外部类了,只能够调用所在外部类的static属性,此时在定义内部类对象的时候,格式也发生变化,“外部类.内部类 内部类对象 = new 外部类.内部类();” 例
class Outer { //外部类
private static String msg = "Hello World!";
static class Inter{ //内部类
public void print(){
System.out.println(msg);
}
}
}
public class TextDemo10{
public static void main(String[] args) {
Outer.Inter in = new Outer.Inter();
in.print();
}
}
三.在方法中定义内部类
理论上,内部类可以在任何位置上定义,这就包括了类中、代码块中、方法中。
方法中的内部类如果想要访问方法的参数或者是方法定义的变量,则参数或者变量前应该加上关键字final(此处只是一个标记并非作用)。例如
class Outer { //外部类
private static String msg = "Hello World!";
public void fun(final int num){
class Inter{ //方法里面定义内部类
public void print(){
System.out.println(Outer.this.msg);
System.out.println(num);
}
}
new Inter().print();
}
}
public class TextDemo10{
public static void main(String[] args) {
new Outer().fun(100);
}
}