语言:
汇编语言
解释型语言:
编程语言
高级编程语言: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();
}
}