zoukankan      html  css  js  c++  java
  • 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);

        }

    }

     

     

  • 相关阅读:
    jquery 插件 lettering.js
    css中一些生僻却好用的属性
    mui-5+api(plus)加载顺序
    网易云音乐mp3外链、真实地址下载方法
    移动端a标签的妙用(拨号、短信、邮件等)
    Android上架mui-app
    ios-app证书配置、打包提交
    前端兼容性问题
    米拓CMS学习总结
    1) 链表顺序存储---之二代码
  • 原文地址:https://www.cnblogs.com/benpaozhimeng/p/6978127.html
Copyright © 2011-2022 走看看