1.编程思维发展史
基于过程:从计算机角度 解决问题 机械思维 c
面向过程:上帝视角 解决问题干预问题 c++ c#
面向对象 c++
面向接口
面向切面
面向微服务和分布式
2.语言发展史
机器语言(01) —> 汇编语言 —> 高级语言(c/c++/Java) —>
超高级语言(Python)
3.面向对象
面试必问(通常作为第一个问题)
—–谈谈你对面向对象的理解?
从程序员的角度把世界上所有的东西用代码进行合理的呈现,java引入了类的概念.类是对具有相同或者相似特征以及行为的一些对象的抽象,对象是类的具体化.
我们改变了传统一步一步按部就班编写代码的思维,把对象抽象成类表示属性和方法的集合体.属性描述的是类的名词特征,方法描述的是类的行为特征.
面向对象包含四大基本特征:抽象/封装/继承/多态
4.类
Java中万物皆类
类是对具有相同或者相似特征以及行为的一些个体的抽象化.
金毛 京巴 博美 柴犬 德牧
犬类
类是抽象的概念,我们把相同或者相似的特征称为属性,属性是名词,比如人类的年龄/性别/姓名/身高…都是属性.把行为称为动作,动作是动词,比如人类的工作/学习/吃饭/睡觉…都是动作.
属性用变量来表示,动作用方法来表示
5.对象
对象是类的具体化,代表的是个体.
比如 你就是人类的一个对象.你家的狗是犬类的一个对象.(:D)
类是对象的抽象,对象是类的具体化
6.类的构建
class 表示一个类
语法:
新建一个Java文件,new java Class
public class 类名{
}
类名必须和.java文件的名字完全一样
属性:
类中的属性允许是各种数据类型,一般不允许设置初始值,且位于方法外面类里面,和所有的方法平级.
方法:
和昨天一样,不要加static
如果方法和main方法平级,需要添加static,否则不需要
public class Book {
//图书的属性
String author; // 作者
String name; // 书名
double price; // 价格
int number; // 编号
String address; // 出版社
// 图书的方法
void beRead() {
System.out.println("书被读取了...");
}
void beBreak() {
System.out.println("书被销毁了...");
}
void beBorrow() {
System.out.println("书被借出了...");
}
}
7.对象的构建
使用类构造对象 —>把抽象化的东西具体化
类构建对象<=>类的初始化<=>初始化一个对象<=>实例化一个对象
↑都差不多意思
语法:
1)需要重新构建一个类,设置main方法
2)使用如下方式构建一个对象:
类名 对象的名字 = new 类名();
Book book01 = new Book();
8.对象属性的访问
语法:
对象的名字.属性的名字
book.name/book.author
给属性设置值:
对象的名字.属性的名字 = 值;
//构建一个对象
Book book01 = new Book();
book01.name = "儒林外史";
book01.author = "吴敬梓";
book01.address = "清华大学出版社";
book01.price = 20.55;
book01.number = 9821;
获取属性的值:
注意:如果不设置值,获取值的时候采用默认值.
属性的类型 变量名 = 对象的名字.属性的名字;
String name = book01.name;
System.out,println(book01.name);
匿名对象
- A:什么是匿名对象
- new Person(“张三”, 46).tell();//通过匿名对象调用方法
- 没有名字的对象
- B:匿名对象应用场景
- a:调用方法,仅仅只调用一次的时候。
- 那么,这种匿名调用有什么好处吗?
- 节省代码
- 注意:调用多次的时候,不适合。匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。
- 那么,这种匿名调用有什么好处吗?
- b:匿名对象可以作为实际参数传递
- a:调用方法,仅仅只调用一次的时候。
9.class和Java文件的关系
一个Java文件中允许包含多个class,但是开发规范不允许(内部类和lambda除外)
有且只有一个被public修饰的类,且该class的名字要和Java文件的名字完全一致(大小写也一样)
10.面向对象中类的设计
1)明确类的名字,必须是个名词,命名规范和标识符命名规范相同,特别注意首字母要求大写
2)明确属性的类型/个数和名字,根据需要确定
3)明确方法的返回值类型/参数列表和名字,根据需要确定
11.对象方法的调用
语法:
对象名.普通的方法调用的语法();
12.类中代码的复用
类里面的属性和方法,可以被当前类的所有对象共享.
但是A对象关于a属性的值专属于A对象的,B对象关于b属性的值专属于B对象.
代码的复用性和对象之间的隔离性共存.
13.类中方法对于属性的访问
类中的方法可以直接使用本类中的属性
方法调用的时候需要设置相关属性的值
14.构造方法
是方法,但是比较特殊
特点:
1)该方法的方法名必须和类名完全一致,首字母大写.
2)该方法没有返回值类型,连void都不能设置.
3)该方法内部一般不允许存在较为复杂的结构.
分支结构/循环结构
4)该方法无法被程序员调用,在构建对象的过程中该方法被系统自动调用.(new
类名();)
5)一个类至少包含一个构造方法
6)如果程序员不写构造方法,系统会自动生成一个默认的方法体为空的不可见的构造方法;如果写了构造方法,系统自动生成的构造方法会消失.
7)构造方法允许重载
语法:
类名(参数列表){
方法体
}
可以在构造方法中的第一行使用this来调用本类其他重载的构造方法
Public Person(){
System.out.println("1");
}
Person(String name,int age){
this.();
this.name = name;
this.age = age;
System.out.println("2");
}
Person(String name,int age,int num){
this(name,age);
this.num = num;
System.out.println("3");
}
15.eclipse断点调试
场景(允许调试的位置):
1)出现bug或者未知的错误的可能位置;
2)方法的调用位置;
3)System.out.println()输出位置
4)其他任何合理的位置
断点就是代码执行到该位置”之前”暂时停顿,之后我们可以根据实际情况手动放行该代码.
16.构造方法的重载
我们在某些情况下可以使用构造方法对类的属性进行初始化
在构建对象的时候需要在new
className();的小括号里面指定参数的值来决定调用哪个构造方法
public class Doctor {
String name;
String sex;
String type;
int age;
Doctor() {
System.out.println("无参构造");
}
Doctor(String n, String s, String t, int a) {
name = n;
sex = s;
type = t;
age = a;
System.out.println("全参构造");
}
Doctor(String n, String s, String t) {
name = n;
sex = s;
type = t;
System.out.println("缺参构造");
}
@Override
public String toString() {
return "Doctor [name=" + name + ", sex=" + sex + ", type=" + type + ", age=" + age + "]";
}
}
public class DoctorTest {
public static void main(String[] args) {
// 构建医生对象
Doctor doctor = new Doctor();
System.out.println(doctor);
Doctor doctor2 = new Doctor("华佗", "男", "全科", 18);
System.out.println(doctor2);
Doctor doctor3 = new Doctor("张仲景", "男", "内科");
System.out.println(doctor3);
}
}