2020.7.17课堂笔记(类和对象)

语言:
汇编语言
解释型语言:
编程语言
高级编程语言:C语言
java、C++
Python
go
Scala
对象是由静态特征和动态特征构成
静态特征:属性
动态特征:方法
类是具有相同特征的对象的集合(抽象)
对象是类的实体
***类是对象的抽象,对象是类的具体实现
面向对象分为:OOA 面向对象程序设计
OOD结构设计
OOP编码设计

方法:
无返回值的时候关注的重点是过程 -->存储过程
有返回值的时候关注的重点是结果 -->函数

无参方法的格式:
无返回值:
[访问修饰符类型] void 方法名(){
代码;
}
有返回值:
[访问修饰符类型] 返回值的类型 方法名(){
代码;
}
方法的调用:
无参方法直接用对象名.方法名()调用即可
有参方法调用:调用的同时要接收
返回值类型 变量名=对象名.方法名();
面向对象:
程序是对现实世界的建模:
把现实世界的概念搬到编程的概念里,是用class和object实现的
class的概念,object的概念
class对应现实世界中的某一类事物
object某一类事物具体的实例(instance):
人本身是一个很抽象的概念,张三这个人,对应的具体的实例

在程序中怎么建立对象的:
没有对象new一个就行了,new shape();在内存里创建了这个对象,就分配了一块内存,里面装了一个shape

类的构造方法,在c++里面叫构造函数,在创建(new)这个类的对象的时候都会被自动调用,和类同名没有返回值,如果不写系统默认会添加一个参数为空的构造方法,如果自己写了任何构造方法(不管有没有参数),系统不会添加默认的那个了

类的属性:
人有身高、体重、性别、年龄
飞机航班号、生产商、油箱能装多少油、翼展
class shape(){
String name;
float area;
}
new出一个对象来的时候,内存里面装了这个对象的一个name,一个area
怎么来操纵这个对象?
C++ 指针 java 引用(其实是C++指针的概念)Python中的变量,windows中的句柄,都是一样的东西,这些里面存储的是对象的地址。
什么叫指针:有这个一小块内存,比如名字叫p,它里面存的值比如说是(0x0001000),这个值代表的是某一个对象的具体地址,当我们拿到这个指针的时候,通过看到里面的这个值,根据这个值所指定的位置,就能找到对应的某个对象,
java里面的引用也是一样的概念,也是这么一小块内存,里面装的是逻辑地址,不是物理地址,通过里面这个值,就能找到某一个具体对象
作为一个指针,在这个指针里面记录了某一个地址,我顺着这个地址找,我可以找到某个对象。其实只能找到这个地址,这个对象有多大,是一个person的对象还是一个shape的对象,这事不好定,如果不说明白这个p指向的是什么类型的对象,就不知道这个p从这个地址往后取多大(Python是自动模拟类型的推断,本质上也是指定的)
有同学说,我就直接用这个地址,直接访问这个对象行不行。。你要操纵这个对象,也得找到这个对象的地址,找到这个地址也得把地址放到变量里,这个变量就是指针的概念
所有的语言概念都是一样的。只要肯敲代码程序就能学会
对象的本质就是一段地址范围,比较复杂的就是对象里面还有一个指针指到别的地方了。
对象的大小,就看你怎么定义的,比如说定义的时候有float类型、int类型、long类型等等,每种类型,它的大小其实都是知道的。对于编译器,一算就知道你定义了这么多属性,总共占了多少。类型的大小是固定的,所有最后这个类的大小就能算出来,它是固定的,忽略了指针、虚函数表这些东西,但本质上就是这么算的。
怎么指定类型:
在java里面 Shape s=new shape();
定义了一个存储地址的变量,这个地址上指向那个类型的变量是一个Shape类型的对象。
一小块空间s里面装了一个地址,指向一大块空间(new 出来的对象)里面有两个东西,一个名字叫name,一个叫area,所有语言都是一样的
通过这个指向对象的指针,可以对对象进行操纵:
s.name=“shape”;
s.area=1.0f;
System.out.println(s.area);
如何回收对象:java和Python由垃圾收集器GC自动回收,牺牲了执行效率
C++使用delete,同时会调用它的析构函数。
理解了内存,就理解了一切
成员方法(成员函数):
class Person{
String name=“pp”;
void printName(){
System.out.println(name);
}
}
public class TestMethod {
public static void main(String[] args) {
Person p=new Person();
p.printName();
}
}
Person.class是一个文件,躺在硬盘上,当java程序开始执行的时候,会把整个的class文件放到内存里,在这个class文件里有很多的内容,其中的一项内容叫做方法表。记录了这个类里面定义的所有方法名,在这个方法表里面肯定有一个printName方法。这个方法表里肯定还有一条是自动添加的构造方法,这个方法的代码也在class的内存里,找的这个名字,记录了这段代码在什么位置。
printName也是一个指针,指向的是要执行的那个代码块。
Person p=new Person();相当于new了一个person对象(调用构造方法,和类同名,没有返回值),里面有一个name属性,它的值是pp,在对象里面没有方法的实现。在编译器看到调用p.printName方法的时候(在C和C++里面,方法的名字本身就是一个指针,函数指针,函数名指向的要执行的代码开始的地方),对应的是person.class,去这个类里面的方法表找到printName方法,找到对应的代码块,这个过程叫方法的绑定。

成员方法(成员函数)
方法名也是指针
通过引用或指针访问成员方法
通过方法名找到方法代码的过程叫做绑定(binding)
编译时vs运行时
complie-time编译期绑定
run-time在main方法开始运行再去找方法对应的代码,运行时绑定(dynamic binding)
main函数开始运行到结束期间
java中大多数方法都是动态绑定(构造方法、static的方法,final的方法,private的方法是静态绑定,编译期绑定)
dynamic binding
run-time binding
Person p=new Person();为什么是动态绑定
1、因为这时候main函数已经开始了,java的任何class是需要的时候才会放到内存
2、java有很多其他的写法,从文本文件里读取,编译器也不知道
3、运行期的绑定,new的是哪个class就去绑定谁的代码
继承(子类继承父类的属性,也可以访问父类的方法,省一些代码和内存)、重写(override子类对父类的方法不满意,重写父类的方法)、多态
在java里面,父类的引用可以指向子类的对象
有继承、有重写、父类引用指向子类对象的时候就会发生多态,new出来的是谁,调用的对应类的方法
多态是面向对象的核心,可扩展性比较好就是来源于多态,设计模式都是多态的扩展

class Goose extends Animal{
void makeSound();
}
只需要把new Dog改成new Goose就会发出鹅的声音
可扩展性(extensibility)添加新功能—>不改原代码结构
面向对象模拟的C语言里的struct 函数指针动态指定,写两个实现,想用哪个就用哪个,想扩展新功能的时候就写一个新的,把函数指针指向它就可以了

School:

package kb09;
/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/17 14:52
 * @Description:学校类
 * 属性:校名、地址、课程
 * 方法:宣传、授课、收费
 **/
public class School {
    String schoolName;
    String address;
    String subject;
    public void advertisement(){
        System.out.println("本校:"+schoolName+",地址为:"+address+
                ",教授课程为:"+subject);
    }
    public void teach(){
        System.out.println("来是come去是go!!!");
    }
    void testUseOther(){
        Student s = new Student();
        s.testUse();
    }
}

Strudent:

package kb09;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/17 14:30
 * @Description:学生类:
 * 属性:姓名、年龄、体重、身高
 * 方法:学习、自我介绍
 **/
public class Student {
    String name;
    int age;
    double weight;
    double height;

    public void study(){
        System.out.println("好好学习,天天向上");
    }

    public void show(){
        System.out.println("我叫:"+name+"我今年"+age+"岁,身高"
                +height+"体重:"+weight);
    }
    public void showBornYear(){
        System.out.println(2020-age);
    }
    public int getBornYear(){
        //return在有参方法里表示返回值
        return 2020-age;
    }

    //方法中调用方法
    void testUse(){
        show();
        System.out.println("-----------------");
        study();
    }

/*    public static void main(String[] args) {
        Student s=new Student();
        s.show();
    }*/
}

TestSchool:

package kb09;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/17 14:56
 * @Description:
 **/
public class TestSchool {
    public static void main(String[] args) {
        School kgc=new School();
        kgc.schoolName="课工场";
        kgc.address="小行路2号经管学院内部";
        kgc.subject="大数据";
        kgc.advertisement();
        kgc.teach();

        kgc.testUseOther();
    }
}

TestStudent:

package kb09;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/17 14:43
 * @Description:
 **/
public class TestStudent {
    public static void main(String[] args) {
        //对象的创建,自定义类型
        Student hao=new Student();
        //属性的赋值
        hao.name="张浩";
        hao.age=20;
        hao.height=180;
        hao.weight=180;
        //方法的调用
//        hao.show();
//        hao.study();
        hao.testUse();
        Student ming=new Student();
        ming.name="李明";
        ming.study();
        hao.showBornYear();
        int bornYear=hao.getBornYear();
        System.out.println(bornYear);
    }
}

Visitor:

package kb09.ticket;
/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/17 16:32
 * @Description:游客类
 * 属性:姓名、年龄
 * */
public class Visitor {
    String name;
    int age;
}

Park:

package kb09.ticket;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/17 16:33
 * @Description:
 **/
public class Park {
    Visitor visitor;
    final int PRICE=100;
    void sellTicket(){
        int age = visitor.age;
        //60岁以上免票,22岁以下半票,其余的全票
        if(age>60){
            System.out.println("滴,老年卡,"+visitor.name+"您需要支付"+0*PRICE);
        }else if(age<22){
            System.out.println("滴,学生卡,"+visitor.name+"您需要支付"+PRICE/2);
        }else{
            System.out.println("滴,普通卡,"+visitor.name+"您需要支付:"+PRICE);
        }
    }
}

TestTour

package kb09.ticket;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/17 16:40
 * @Description:
 **/
public class TestTour {
    public static void main(String[] args) {
        Visitor v=new Visitor();
        v.name="张浩";
        v.age=20;
        Park p=new Park();
        p.visitor=v;
        p.sellTicket();
    }
}

User:

package kb09.pwd;
import java.util.Scanner;
/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/17 17:30
 * @Description:
 **/
public class User {
    String username="admin1";
    String password="111111";
    void changePWD(){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name=sc.next();
        System.out.println("请输入密码:");
        String pwd=sc.next();
        if(name.equals(username) && pwd.equals(password)){
            //用户名和密码都正确可以修改密码
            System.out.println("请输入新密码:");
            password=sc.next();
            System.out.println("修改密码成功,您的新密码为:"+password);
        }else{
            System.out.println("用户名和密码不正确,您没有权限修改");
        }
    }
    public static void main(String[] args) {
        User user=new User();
        user.changePWD();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值