20200719-面向对象基础——(类与对象)(在静态方法中不能直接访问实例变量和实例方法的原因)

20200719-面向对象基础(类与对象)(在静态方法中不能直接访问实例变量和实例方法的原因)

课堂笔记

语言:
汇编语言
解释型语言
汇编语言高级编程语言 c语言
Java、c++
对象是由静态特征和动态特征构成;
静态特征:叫属性
动态特征:叫方法
类是具有相同特征的对象的集合(抽象)
对象是类的实体
标准说法:类是对象的抽象。对象是类的具体实现

面向对象分为:OOA.OOD.OOP
方法:无返回值的时候关注的重点是过程 —>存储过程
有返回值的时候关注的重点是结果 ----->函数

方法的格式:
无返回值:
[访问修饰符类型] void 方法名(){
代码;}

有返回值的:[访问修饰符类型] 返回值类型 方法名(){
代码;}

方法的调用:无参方法的调用 :
对象名 方法名()调用即可
有参方法的调用 :
返回值类型 变量名 = 对象名.方法

代码部分

一、学校类

  • 属性: 校名、地址、课程
  • 方法:宣传、授课

定义函数部分的代码:

public class School {
    
    
    String schoolName;
    String address;
    String subject;
    public void adertisement(){
    
    
        System.out.println("本校:"+schoolName+",地址为:"+address+",教授课程为:"+subject);
    }
    void testUseOther(){
    
    
        Student s = new Student();
        s.show();
    }
}

调用函数部分的代码:

public class TestSchool {
    
    
    public static void main(String[] args) {
    
    
        School qingNiao = new School();
      qingNiao.testUseOther();
    }
}

二、游客类

  • 属性:姓名 年龄

定义部分的代码:

游客类:

public class Visitor {
    
    
    String name;
    int age;
}

公园类:

public class Park {
    
    
    Visitor visitor; //属性
    final int PRICE = 100;
    void sellTicket(){
    
    
        int age = visitor.age;
        //60岁以上免票,20岁以下半票,其余全票
        if (age>60){
    
    
            System.out.println("滴,老年卡,您需要支付"+0*PRICE);
        }else if (age<22){
    
    
            System.out.println("滴,学生卡,您需要支付"+PRICE/2);
        }else {
    
    
            System.out.println("滴,普通卡,您需要支付"+PRICE);
        }
    }
}

调用函数部分:

public class TestTour {
    
    
    public static void main(String[] args) {
    
    
        Visitor v = new Visitor();
        v.name = "zhanghao";
        v.age = 22;
        Park p = new Park();
        p.visitor=v;
        p.sellTicket();
    }
}

补充:
在静态方法中不能直接访问实例变量和实例方法的原因:
静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。

非静态描述:非静态方法和变量(如局部变量等)存在于栈中,是线程独立的,属于每个对象实例。而对象实例又存储与堆中,是内存共享的。
对象实例有权访问静态变量,并且不会影响到正常的对静态方法和变量的调用

所以 非静态方法,由于创建时间上的滞后性,有权访问静态方法和变量

猜你喜欢

转载自blog.csdn.net/qq_42005540/article/details/107444054