zoukankan      html  css  js  c++  java
  • 第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修饰的使用"{}"划定的代码区域,先于构造代码块执行.

  • 相关阅读:
    新增数据盘
    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
    将tomcat的protocol改为APR模式,以提高性能
    POJ 2195 Going Home (最小费用最大流)
    HDU 2732 Leapin' Lizards (最大流)
    POJ 2516 Minimum Cost (最小费用最大流)
    POJ 1087 A Plug for UNIX (最大流)
    POJ 3281 Dining (最大流)
    HDU 3605 Escape (最大流)
    POJ 1149 PIGS (最大流)
  • 原文地址:https://www.cnblogs.com/youjunhui/p/14883293.html
Copyright © 2011-2022 走看看