1 面向对象
1.1 概述
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
1.2 面向对象跟面向过程
面向对象 分模块 强调的是高度抽象
面向过程 侧重一步步进行 把要完成的功能分析每一步,然后一步一步写函数 调用函数
面向对象优点 耦合性下降 容易维护 拓展 灵活 但是性能下降
1.3 构造方法
构造方法每一个类都有 用于创建该类对象
如果这个类没有构造方法的话 编译器会自动生成一个无参构造方法;
如果在该类写了构造方法 那么默认的无参构造将会没有
因此我们可以在写有参构造方法的时候 在写一个无参构造
构造方法声明 修饰符列表(可以没有) 方法名(跟类名一样)(参数列表){}
参数列表可以没有 没有的话是无参构造
修饰符列表不能使用static 只使用权限修饰符 public private protected 不写
没有返回值 更没有void
1.4 类跟对象
类:对一类事物客观描述的标准 里面包括相同的属性 行为
对象 类的实例化 一切皆对象 具体的个体 符合类中的标准 可以给这些属性赋值
根据不同的属性值区分不同的对象
根据不同的属性来区分不同的类
局部变量 方法里面使用 暂时存储数据,作用域在方法体 方法结束也就销毁
静态变量 类级别的变量 所有该类对象访问这个变量的时候 值是一样的,对象访问相当于使用类名访问
成员变量 对象级别 所有该类对象都有这个属性 值可能相同可能不同
如果方法要使用成员变量那么一定是成员方法
1.5 对象使用
成员变量是有默认值的
Student student = new Studen();
System.out.println(s1.id);
s1.id=10;
System.out.println(s1.id);
s1.name="张三";
System.out.println(s1.name);
1.6 Bean
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
成员变量是私有的’
getters settets 方法访问变量
具有无参构造方法
类是公共的
public class User {
private int age;
private String name;
private int password;
//无参构造
public User(){
}
//全参构造 这样的话会不用使用很多set方法来初始化 直接在构造的时候初始化
public User(int age,int password,String name){
this.age=age;
this.password=password;
this.name=name;
}
//带参构造
public User(int age,String name){
this.age=age;
this.name=name;
}
//get set 方法让对象访问修改成员变量
public void setUsername(String name){
//成员方法直接使用成员变量
//this代表当前对象谁调用这个方法 this代表的就是哪个对象
this.name=name;
}
public String getUsername(){
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
}
通过set get 方法是类里面的数据封装 这样不能直接被访问修改利于代码安全以及维护
1.7实例化
创建一个类的对象
Student student =new Student();
new 会在堆内存开辟新的空间存储对象成员属性
调用构造方法(构造方法压栈)对堆内存的数据初始化,如果沒有传输数据就赋予默认值
构造方法执行完 弹栈 然后堆内存地址赋予给调用处student;
① 加载客户端OOP_03
②调用客户端main方法压栈
③加载Student类到静态区
④开辟堆内存空间
⑤调Student里面的构造方法压栈对成员属性初始化
⑥构造方法弹栈 堆内存地址赋予调用处
1.8 常见异常
Exception in thread "main" java.lang.NullPointerException
空指针异常
public static void main(String[] args) {
User u1=new User();
u1=null;// u1指向了空就找不到堆内存里面的数据
System.out.println(u1.getAge());
}
1.9对象调用静态属性
对象可以调用静态变量
public class OOP_05 {
//静态变量
static int a=10;
//成员变量
int b=20;
public static void main(String[] args) {
int a=5;
OOP_05 s1=new OOP_05();
System.out.println(s1.b);
s1=null;
//因为a不在堆区 所以s1即使改了指针为null,编译时会把对象名改为类名.a
System.out.println(s1.a); //10
System.out.println(OOP_05.a); //10
System.out.println(a); //5
//this 不会用在静态方法里面
//System.out.println(this);
}
1.10注意事项
1.10.1 静态调用成员
静态方法里面无法直接使用成员变量
1.10.2 传值和传引用
与数组类似 都是引用数据类型
public class OOP_06 {
public static void main(String[] args) {
Test t=new Test(11);
m1(t);
System.out.println(t.age); //10
}
public static void m1(Test t){
int age=12;
t.age=10;
System.out.println(age);
}
}
class Test{
int age;
Test( int age){
this.age=age;
}
}
1.10.3区分成员方法与构造方法
public static void main(String[] args) {
new OOP_07(11);
new OOP_07();
//new OOP_07(" "); 出错这个不是构造方法是成员方法
}
public OOP_07(int a){
}
OOP_07() {
}
//成员方法可以和类名一样
//如何区分同名的成员方法跟构造方法 就看有没有返回值 构造方法没有返回值更没有void
public void OOP_07(String s){
}