• Static、this、super关键字。


    * 1.使用static关键字修饰的成员变量(属性):全局变量或类变量*

    成员变量和全局变量的区别:

    * a.在计算机内存中保存的位置不同:

    * 成员变量保存在堆中,全局变量保存在方法区
    * b.保存的份数不同
    * 成员变量每new一次都开辟空间,保存多份。
    * 全局变量只有1份
    * c.访问方式不同
    * 成员变量:对象名.属性,可以使用this关键字。
    * 全局变量:类名.属性(推荐)
    * 对象名.属性
    * d.创建时间不同:
    * 成员变量:只有使用new关键字创建对象时才会在堆中为其分配空间
    * 全局变量:在类加载时在方法区中分配空间。
    *
    * 2.使用static关键字可以修饰方法:静态方法或类方法
    * 特点:静态方法中无法访问非静态的成员变量或方法;但非静态的方法中是可以访问静态的成员
    * 访问方式:
    * 类名.方法名(推荐)
    * 对象名.方法名

    访问方式:类名.属性或类名.方法名()
    */

    *3.使用static修饰代码块,静态代码块
    * 语法:static{
    * //代码
    * }
    * 执行过程:在类加载时执行静态代码块。静态代码块>普通代码块>构造方法。只会执行1次。
    *
    * 代码块:使用花括号包含的代码。使用比较少。不需要显式调用。
    * 代码块的执行顺序:在创建实例时执行。代码块在构造方法之前执行,并且按照顺序执行,每创建一个对象就会执行1次。执行多次。
    *
    * 类中代码的执行顺序:
    * 静态代码块>代码块>构造方法>静态方法或实例方法。
    * 静态的方法中只能访问静态变量, 非静态的方法可以访问静态或非静态的变量
    */


    public class TestStatic {
    static int count=0;
    int count2=0;
    //代码块1
    {
    System.out.println("普通代码块1被调用了....");
    // System.out.println(count);
    System.out.println(count2);
    }
    //静态代码块
    static{
    System.out.println("静态代码块1被调用....");
    }
    //构造方法
    public TestStatic(){
    System.out.println("TestStatic构造方法被调用了...");
    }
    //代码块2
    {
    System.out.println("普通代码块2被调用了....");
    }
    //静态代码块2
    static{
    System.out.println("静态代码块2被调用....");
    }

    //静态方法:
    public static void m1(){
    System.out.println("静态方法m1被调用了....");
    }

    //实例方法:
    public void m2(){
    System.out.println("实例方法m2被调用.....");
    }

    public static void main(String[] args) {
    TestStatic testStatic = new TestStatic();
    //静态方法
    testStatic.m1();//对象名.方法名();
    //普通方法
    testStatic.m2();
    // System.out.println("******************");
    // TestStatic testStatic2 = new TestStatic();
    }

    }


    public class Student {
    public String name;//姓名
    public int age;//年龄
    public double height;//身高
    public double weight;//体重
    public static String className;//班级
    public Student(){

    }
    public Student(String name,int age,double height,double weight,String className){
    this.name=name;
    this.age=age;
    this.height=height;
    this.weight=weight;
    // this.className=className;
    Student.className=className;//静态
    }

    public void showInfo(){
    System.out.println("姓名:"+name);
    System.out.println("年龄:"+age);
    System.out.println("身高:"+height);
    System.out.println("体重:"+weight);
    System.out.println("班级:"+className);//非静态的方法中是可以访问静态属性
    }

    public static void study(){
    System.out.println("good good study!");
    System.out.println("day day up!");
    // System.out.println(name);//静态方法不能访问非静态的成员变量。
    System.out.println(className);//
    }
    }

    public class TestStudent {
    public static void main(String[] args) {
    //1.创建对象:
    Student student = new Student("zhangsan", 20, 175, 70, "A101");
    student.showInfo();
    // student.study();//不推荐
    Student.study();//推荐
    System.out.println("*********************************");
    Student student2 = new Student("lisi", 22, 180, 80, "A101");
    student2.showInfo();
    }
    }

    this关键字:代表当前对象本身。
    * 1.可以通过this关键字区分成员变量和局部变量
    * 2.可以通过this访问当前对象的成员变量和成员方法(可以使用this调用属性和方法)
    * 3.可以使用this关键字调用构造方法,但是必须放在构造方法的第一行。
    */



    public class Dog2 {
    public String name;//姓名
    public String bland;//品种
    public int age;//年龄
    public String color;//颜色
    /**
    * 无参构造方法
    */
    public Dog2(){

    }

    public Dog2(String name,String bland,int age){
    this.name=name;
    this.bland=bland;
    this.age=age;
    }
    /**
    * 有参数构造方法
    * @param _name
    * @param _bland
    * @param _age
    * @param _color
    */
    public Dog2(String name,String bland,int age,String color){
    // this.name = name;
    // this.bland= bland;
    // this.age = age;
    this(name,bland,age);//通过this调用构造方法
    this.color = color;
    }

    public void test(){
    System.out.println("测试this关键字调用实例方法....");
    }

    public void showInfo(){
    System.out.println("名字:"+this.name);//通过this访问当前对象的属性
    System.out.println("品种:"+this.bland);
    System.out.println("年龄:"+age);
    System.out.println("颜色:"+color);
    this.test();//通过this方法当前对象的实例方法
    }
    }

    public class TestDog2 {
    public static void main(String[] args) {
    // Dog dog = new Dog();
    // dog.name="旺财";
    // dog.age=2;
    // dog.bland="中华田园犬";
    // dog.color="黄色";
    Dog2 dog = new Dog2("旺财", "中华田园犬", 2, "黄色");
    dog.showInfo();
    Dog2 dog2 = new Dog2("大黄", "黑贝", 3, "黑色");
    dog2.showInfo();
    }
    }

    super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。

     

    普通方法:

       没有顺序限制。可以随便调用。

        构造函数中: 任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(...);那么Java默认都会调用super();作为父类的初始化函数。 所以你这里的super();加不加都无所谓。

    public class Test {

        public static void main(String[] args) {

           new ChildClass().f();

        }

    }

    class FatherClass {

        public int value;

        public void f(){

            value = 100;

            System.out.println

            ("FatherClass.value="+value);

        }

    }

    class ChildClass extends FatherClass {

        public int value;

        public void f() {

            super.f();  

            value = 200;

            System.out.println

                 ("ChildClass.value="+value);

            System.out.println(value);

            System.out.println(super.value);

        }

    }

     

     

  • 相关阅读:
    树链剖分 (模板) 洛谷3384
    ST表 (模板) 洛谷3865
    IOI 2005 River (洛谷 3354)
    IOI 2005 River (洛谷 3354)
    poj1094 Sorting It All Out
    poj1094 Sorting It All Out
    spfa(模板)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    洛谷1850(NOIp2016) 换教室——期望dp
  • 原文地址:https://www.cnblogs.com/benpaozhimeng/p/6978127.html
Copyright © 2020-2023  润新知