JAVA学习笔记(九)

匿名对象

1.1匿名对象的概念

  匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。

  如,创建一个普通对象

Person p = new Person();

  创建一个匿名对象

new Person();

1.2匿名对象的特点

  1.创建匿名对象时直接使用,没有方法名。

new Person().eat()  //eat方法被一个没有名字的Person对象调用了。

  2.匿名对象在没有指定其引用变量时,只能使用一次。

new Person().eat(); 创建一个匿名对象,调用eat方法
new Person().eat(); 想再次调用eat方法,重新创建了一个匿名对象

  3.匿名对象可以作为方法接收的参数、方法返回值使用

class Demo {
    public static Person getPerson(){
        //普通方式
        //Person p = new Person();    
        //return p;
        
        //匿名对象作为方法返回值
        return new Person(); 
    }
    
    public static void method(Person p){}
}

class Test {
    public static void main(String[] args) {
        //调用getPerson方法,得到一个Person对象
        Person person = Demo.getPerson();
        
        //调用method方法
        Demo.method(person);
        //匿名对象作为方法接收的参数
        Demo.method(new Person());
    }
}

内部类

2.1内部类的概念

  将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。

  内部类分为成员内部类与局部内部类。

2.2成员内部类

  定义格式

class 外部类 { 
    修饰符 class 内部类 {
        //其他代码
}
}

  访问格式

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

2.3局部内部类

  局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问。

定义格式

class 外部类 { 
    修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}

访问方式:在外部方法中,创建内部类对象,进行访问。

2.4匿名内部类

  最常用到的内部类就是匿名内部类,它是局部内部类的一种。

  匿名内部类的作用:简化代码。

  使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成,。虽然是两个步骤,但是两个步骤是连在一起完成的。

public class Test {
    Function f=null;
    public static void main(String[] args) {
        smoking s=new smoking(){
            public void smoke() {
                System.out.println("猴子抽烟");        
            }
        }.smoke();
    }
}

包的声明与访问

  Java的包,其实就是我们电脑系统中的文件夹,包里存放的是类文件。

3.1包的声明格式

package 包名.包名.包名…;

3.2包的访问

  在访问类是,为了能找到该类,必须使用含有包名的类全名(包名、类名)。

3.3import导包 

  导包的格式:

import 包名.类名;

  当程序员导入指定的包后,使用类时,就可以简化了

//导入包前的方式
//创建对象
java.util.Random r1 = new java.util.Random();
java.util.Random r2 = new java.util.Random();
java.util.Scanner sc1 = new java.util.Scanner(System.in);
java.util.Scanner sc2 = new java.util.Scanner(System.in);

//导入包后的方式
import java.util.Random;
import java.util.Scanner;
//创建对象
Random r1 = new Random();
Random r2 = new Random();
Scanner sc1 = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);

访问修饰符

  在Java中提供了四种访问权限,使用不同的访问权限时,被修饰的内容会有不同的访问权限,以下表来说明不同权限的访问能力:

  归纳:

  要想仅能在本类中访问使用private修饰;

  要想本包中的类都可以访问不加修饰符即可;

  要想本包中的类与其他包中的子类可以访问使用protected修饰

  要想所有包中的所有类都可以访问使用public修饰。

  注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。

代码块

4.1局部代码块

  局部代码块是定义在方法或语句中

特点:

  1.以”{}”划定的代码区域,此时只需要关注作用域的不同即可

  2.方法和类都是以代码块的方式划定边界的

class Demo{
    public static void main(String[] args)    {
        {
                  int x = 1;
                 System.out.println("普通代码块" + x);
        }
        int x = 99;
        System.out.println("代码块之外" + x);
    }
}
//运行结果:普通代码块1
//代码块之外99

4.2构造代码块

  构造代码块是定义在类中成员位置的代码块。

特点:

  1.优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作。

  2.每创建一个对象均会执行一次构造代码块。

public class Person {
    private String name;
    private int age;
    
     //构造代码块
    {
        System.out.println("构造代码块执行了");
    }
    Person(){
        System.out.println("Person无参数的构造函数执行");
    }
    Person(int age){
        this.age = age;
        System.out.println("Person(age)参数的构造函数执行");
    }
}
class PersonDemo{
    public static void main(String[] args)    {
        Person p = new Person();
        Person p1 = new Person(23);
    }
}

4.3静态代码块

  静态代码块是定义在成员位置,使用static修饰的代码块。

特点:

  1.它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。

  2.该类不管创建多少对象,静态代码块只执行一次。

  3.可用于给静态变量赋值,用来给类进行初始化。

public class Person {
    private String name;
    private int age;
     //静态代码块
    static{
        System.out.println("静态代码块执行了");
    }
}

 

  

posted @ 2018-04-03 16:22  445412434  阅读(158)  评论(0编辑  收藏  举报