第7章 类的高级特性

Posted 啊...这

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第7章 类的高级特性相关的知识,希望对你有一定的参考价值。

修饰符:

1、Static修饰符

  平时我们在调用类的属性和方法的时候,都要通过创建类对象来调用.

但是如果使用Static修饰符来修饰方法或属性,就可以直接通过类名.方法

或属性来调用,当然,也还是可以通过对象来调用.

class 类名
{
 static 数据类型 成员变量名;

 访问权限修饰符 static 返回值类型 方法名()
 {
    //方法实现
 }
}//调用 类名.方法或属性;

被static修饰的成员变量被称为静态变量

被static修饰的成员方法被称为静态方法

被static修饰的成员变量和方法不属于这个类的某个对象,而属于这个类.

 

当类被加载如内存的时候,就在方法区给静态成员变量创建了内存空间,并对静态成员变量进行了初始化,因此静态变量的内存空间分配比类的对象的创建早.

注意:所有的对象共享静态变量的值,当其中一个对象修改静态变量的值,其他对象访问该静态变量时,静态变量的值就是修改之后的值

,且静态方法只能访问静态变量,不能访问类中的非静态变量.

 

什么时候该用static修饰符来修饰成员变量和成员方法?

 当想要多个对象共用一个成员变量的时候,或是想直接通过类名来调用方法和成员变量的时候.

 

2、Final修饰符

final修饰的类不能被继承, 但是可以继承其他类.

final修饰的方法不可以被覆盖(重写)

final修饰的变量称之为常量,只能赋值第一次.

final引用类型的变量值为对象地址值时,地址不能更改,但地址内的对象属性值可以修改.

final修饰成员变量时,需要在创建对象前赋值,否则会报错

在java程序开发中,如果想在类中定义一个静态常量,通常使用public static final修饰的变量来定义.

class Student{
public static final 数据类型 变量名=常量值;
}

 

注意:接口中的每个成员变量都默认使用public static final来修饰,所有接口的成员变量已经是静态常量了,由于接口没有构造方法,所以必须显示赋值.访问成员变量时可以直接用接口名访问.

 

代码块:

代码块大致可以分为三种:

1、局部代码块:定义在方法或语句中,就是以"{ }"划定的代码区域,方法和类都是以代码块的方式划定边界的.注意:作用域的不同

2、构造代码块:是定义在类中成员位置的代码块,比构造方法更早执行.构造代码块用于执行所有对象均需要的初始化动作,每创建一个对象均会执行一次构造代码块.

  例子:

public class Person {
    int id;
    public Person() {//这是构造方法
        super();
        System.out.println("Person的构造方法运行");
    }
{//这是构造代码块 System.out.println("Person的构造代码块运行"); } public static void main(String args[]) { Person person1=new Person();//构造代码块会先比Person的构造方法早运行. } }

运行结果:

  Person的构造代码块运行
  Person的构造方法运行

3、静态代码块:  是定义在成员位置中,使用static修饰的代码块.他比构造代码块还先于执行,但是他只在运行一次.当该类加载进内存块的时候,他就会运行.

作用:给静态变量赋值,对类进行初始化.

 

public class Person {
    int id;
    public Person() {//这是构造方法
        super();
        System.out.println("Person的构造方法运行");
    }
    {//这是构造代码块
        System.out.println("Person的构造代码块运行");
    }
    static {
        System.out.println("Person的静态代码块运行");
    }
    public static void main(String args[])
    {
        System.out.println("Person");//构造代码块会先比Person的构造方法早运行.
    }
    
}
//运行结果:
//Person的静态代码块运行
//Person

 

 

 

运行顺序:静态代码块<构造代码块<构造方法

 

匿名对象

匿名对象就是指创建对象时,只有创建对象的语句(即new 类型()),但没有把对象地址值赋值给某个变量.(只创建,不引用)

用法:

1、创建匿名对象直接用来直接调用该对象的成员变量或方法,没有引用存储该对象的地址,只能使用一次.

语法:

new Person().eat();
//new 类名(构造方法参数).方法或成员变量;

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

 例子:

public class Person {
    int id=01;
    String name="小张";
}



public class Demo {
    public static Person getPerson() {//这就是将类作为函数的返回类型
        return new Person();//将匿名类作为返回值
    }
    public static void printlnIDNAME(Person p) {
        System.out.println(p.id+" "+p.name);
    }
    public static void main(String args[])
    {
        System.out.println(Demo.getPerson());
        Demo.printlnIDNAME(new Person());//这是将匿名类作为方法的参数来使用
    }
}

运行结果:

 

 

 

内部类

什么是内部类?

  在类的内部定义的另一个类就是内部类.而这个内部类所在的类就被称为外部类.

  内部类根据位置、修饰符、定义的方式可以分为:1、成员内部类 2、方法内部类

 

成员内部类:

在一个类中不仅可以定义成员变量和成员方法,还可以再定义一个类

在类中定义的类就被称为成员内部类,并且在成员内部类中还可以访问外部类的所有成员(比如成员变量和成员方法),外部类无法访问内部类的成员变量和方法.并且创建出来的内部类对象只能访问内部类的成员变量和成员方法.

例子:

class bottle{//这是一个外部类
    int capacity=200;
    
    public  void printCapacity() {//外部类的方法
        System.out.println(this.capacity);
    }
    
    class water{//这是一个内部类
        String name="可乐";
        
        public void printName() {//内部类的方法
            printCapacity();//成员内部类也可以使用外部类的方法
            System.out.println(capacity+"ml的"+name);//成员内部类也可以使用外部类的成员变量
        }
    }
    
    public void demo1(){
        
        new water().printName();//虽然外部类无法直接访问内部类的方法和成员变量,但可以通过在方法里创建内部类的类型的对象来调用
    }
    
}
public class demo {
    public static void main(String args[])
    {
        bottle.water b1=new bottle().new water(); 
        //成员内部类的引用:外部类名.内部类名 变量名=new 外部类名(构造参数).内部类名(构造参数); 
        b1.printName();//内部类类型的变量只能够调用内部类的方法和参数
        String name=b1.name;
        bottle b2=new bottle();
        b2.demo1();
        
    }
}

运行结果:

200
200ml的可乐
200
200ml的可乐

特点:

内部类是在类内部定义的类.

内部类中可以直接访问外部类的成员变量和方法,但外部类中想要访问内部类中的成员,就得创建对象来访问(或者设置为静态来通过类名.成员来访问).

创建内部类对象的方式和平时创建普通类的对象方式不同.

外部类.内部类 变量名= new 外部类(构造参数).new 内部类(构造参数);

 

方法内部类:

方法内部类,顾名思义就是定义在方法内部的类,但是他只能在当前方法中使用.

例子:

public class Demo1{
    public void printNum()
    {
        class Num {//这就是在printNum方法中的方法内部类Num
            int num=10;
        }
        System.out.println(new Num().num);//只有这个方法才能访问Num类
    }
    public static void main(String args[])
    {
        Demo1 demo = new Demo1();
        demo.printNum();
    }

}

特点:在方法之中定义的类

  只能在该方法中使用该内部类

 

 

课后习题

1、static修饰符的作用是什么?

static用于修饰类中的成员变量或成员方法,可以使成员变量和成员方法直接通过类名.成员名调用

并且被static修饰的成员变量和成员方法是属于类的,不单属于该类的某个对象,在加载这个类的时候,这个类的静态成员变量就分配了内存空间并进行了初始化,所以比对象的创建早.

2、代码块有哪几种?

有三种:1、局部代码块:在方法或语句中用"{}"划定的代码区域  2、构造代码块:在类中直接使用"{}"定义在成员位置的代码块,先于该类的构造函数执行.3、静态代码块:在类中使用static修饰的使用"{}"划定的代码区域,先于构造代码块执行.

 

以上是关于第7章 类的高级特性的主要内容,如果未能解决你的问题,请参考以下文章

再看《JavaScript高级程序设计》第6-7章

高性能mysql 第7章 mysql高级特性之分区表

《深入理解Java虚拟机》-----第7章 虚拟机类加载机制——Java高级开发必须懂的

第9章 Java类的三大特性之一:继承

第8章 类的高级概念

第11章(上)--面向对象编程(高级特性)