java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java super this static关键字

Java super、this、static关键字实践案例

作者:美味蛋炒饭.

本文详细介绍了Java继承的概念,包括继承的本质、创建子类对象的过程、方法重写和方法重载的区别,以及Java的继承层次,此外,还讨论了super和this关键字的用法,以及static关键字的归属、内存模型、静态方法的调用限制和静态代码块的执行时机,感兴趣的朋友一起看看吧

一.Java继承

(1)继承

继承的本质就是代码的复用,子类继承父类的全局变量和方法(public,protected)

public class Animal{
    public String name;
    public String color;
    public void run(){
    }
    public void eat(){
    }
    //....
}
public class Dog extends Animal{
    public String name;
    public String color;
    public void run(){
    }
    public void eat(){
    }
    //....
}
public class Cat extends Animal{
    public String name;
    public String color;
    public void run(){
    }
    public void eat(){
    }
    //....
}

(2)继承父类并创建对象在内存当做发生什么

创建子类的时候一定会去创建父类对象---->先创建父类对象,在创建子类对象

(3)Java程序为什么new 子类对象时,结果先创建父类对象在创建子类对象

原因在于有方法重写

*****方法重写和方法重载的区分

1)方法重写:父类的方法被子类重写(父类当中的方法不应完全适用于子类)

2)方法重载:发生在同一个类当中,方法名称相同,参数列表不同的方法,叫做方法

Java程序是通过方法的签名来验证这是不是一个方法(方法签名:方法名+参数列表(数据类型)

public class Cat extends Animal {
    public void run() {
        System.out.println("迈开四只脚跑……");
    }
    public void jump(){
        System.out.println("跳起来了……");
    }
    public void jump(int a){
        System.out.println("跳起来了……");
    }
    public void jump(String name){
    }
}

Cat类中,jump方法出现了多次:

(4)Java继承层次--------->Java只支持单继承

一个子类只能有一个父类,一个父类可以有多个父类

是用来防止因多继承带来的复杂逻辑和内存管理问题

二.super关键字

super代表父类,调用父类当中的方法和变量

public void jump(int a) {
    super.color = "黑色";
    super.run();
    super.eat();
    System.out.println("猫跳高了......");
}

jump(int a)方法中:

三.this关键字------------>this代表当前对象

(1)this属性名称

Java中为解决变量的名称冲突和不确定性问题,引入关键字this代表其所在方法的当前对象的引用。

(2)this:方法名

代表当前的对象调用某一方法。

(3)注意

1)不能在普通方法当前中只能在构造方法中使用。

2)在构造方法当中必须是第一条语句。

3)不能和super()一起使用。

四.static关键字

(1)static的 “归属” 本质

static 修饰的元素属于 “类”,而非类的 “对象(实例)”。

示例:.java 源文件(如 Hello.java)编译为 .class 字节码后,static 成员随类加载到方法区,不依赖对象存在。

(2)static的内存模型(JVM 视角)

JVM 内存分为虚拟机栈、堆、方法区static 成员的存储规则如下:

public class TestConfigParser {
    public static void main(String[] args) {
        eat();
        new TestConfigParser().run();
    }
    public void run(){}
    public static void eat(){}
}

(3) 静态方法(类方法)

public class TestConfigParser {
    public static void main(String[] args) {
        new TestConfigParser().run(); // 非静态方法需通过对象调用
    }
    public void run(){} // 非静态方法
    public static void eat(){} // 静态方法
}

(4)静态代码块

public static void main(String[] args) {
    Demo demo = new Demo();
    Demo demo1 = new Demo();
    Demo demo2 = new Demo();
    demo.from = "中国"; // 修改静态变量
    System.out.println(demo.from);   // 输出“中国”
    System.out.println(demo1.from);  // 输出“中国”
    System.out.println(demo2.from);  // 输出“中国”
}

(5)static的加载顺序

public class Test extends Base {
    static {
        System.out.println("Test static");
    }
    public Test() {
        System.out.println("Test constructor");
    }
    public static void main(String[] args) {
        new Test();
    }
}
class Base {
    static {
        System.out.println("Base static");
    }
    public Base() {
        System.out.println("Base constructor");
    }
}
// 执行结果:
// Base static
// Test static
// Base constructor
// Test constructor
class Demo {
    public Demo(String aa) {
        System.out.println("=====" + aa);
    }
    static {
        System.out.println("11");
    }
    public static Demo demo = new Demo("+++");
    static {
        System.out.println("22");
    }
}
class Test {
    public static void main(String[] args) {
        Demo demo = new Demo("----");
    }
}
//11
//=====+++
//22
//=====----

到此这篇关于Java super、this、static关键字的文章就介绍到这了,更多相关java super this static关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文