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指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。
非静态描述:非静态方法和变量(如局部变量等)存在于栈中,是线程独立的,属于每个对象实例。而对象实例又存储与堆中,是内存共享的。
对象实例有权访问静态变量,并且不会影响到正常的对静态方法和变量的调用
所以 非静态方法,由于创建时间上的滞后性,有权访问静态方法和变量