面向对象特征之封装
1.封装的种类:
一段代码,你写了三遍 ==> 封装成方法
一堆方法,你用了三遍 ==> 封装成工具类
一个工具类,你使用了三遍 ==> API
重要的在于封装的思想。
2.JavaBean规范的封装格式必要性
在Java中定义符合JavaBean规范的类有什么要求
1. 所有的成员变量全部私有化 ==> private
2. 必须提供一个无参数构造方法
3. 要求使用private修饰的成员变量提供对应的操作方法 ==> Setter Getter
- JavaBean中的private
package com.qfedu.a_private;
/*
* Private关键字使用
*/
class Dog {
private String name;
int age;
char gender;
public void testField() {
// 类内可以直接使用私有化private修饰的成员变量
name = "Bobo";
test();
}
private void test() {
System.out.println("烤羊排!!!");
}
}
public class Demo1 {
public static void main(String[] args) {
Dog dog = new Dog();
// 没有使用private约束的情况下,类外可以使用
// 当成员变量使用private修饰之后,当前成员变量类外没有操作权限
// The field Dog.name is not visible
// dog.name = "王可可";
dog.age = 5;
dog.gender = '雌';
// The method test() from the type Dog is not visible
// 使用private修饰的方法类外不能使用
// dog.test();
}
}
private关键字是一个权限修饰符,private修饰的成员变量,成员方法,【构造方法】都是私有化内容,有且只能在类内使用,类外没有任何的操作权限!!!
4.javaBean 中的set、get
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
5.对象的生成
Factory factory = new Factory();
// 通过修理店对象,调用修理电脑的方法
// 需要的参数是Computer类对象
factory.repair(computer);
匿名对象:
匿名对象:
new 构造方法(必要的参数);
匿名对象的用途:
1. 使用匿名对象直接调用类内的成员方法
2. 匿名对象直接作为方法的参数
注意:
使用匿名对象不要操作成员变量,有可能是有去无回
优势:
1. 阅后即焚,匿名对象在使用之后 立即被JVM GC收回
2. 解决内存空间,提高效率,简化代码书写
面向对象特征之继承
1.继承的方式:extends
- 子类继承父类之后,可以使用父类的非私有化成员变量和成员方法
【非私有化成员】
2. 子类不能继承得到父类的私有化内容。
2.调用父类的构造方法:super()
3.对父类方法的重写:为了解决父类的方法不能满足目前子类的需求时使用
@Override
严格格式检查
要求重写方法的和父类中的方法,声明完成一致,返回值类型,方法名和形式参数列表
4,抽象:对父类继承过来的方法强制性的实现
abstract使用总结:
1. abstract修饰的方法没有方法体
2. abstract修饰的方法必须定义在abstract修饰的类内或者interface接口内
3. 一个普通类【非abstract】修饰的类,继承了一个abstract类,那么必须实现在abstract类内的所有abstract,强制要求
4. 如果一个abstract A类继承另一个abstract B类,A类可以选择实现B类中abstract方法。
5. abstract修饰的类内允许普通方法
6. abstract修饰的类不能创建自己的类对象!!!
【原因】
abstract修饰的类内有可能存在abstract修饰的方法,而abstract修饰的方
法是么有方法体的,如果说创建了abstract修饰类对应的对象,不能执行没
有方法体的abstract方法
7. 一个类内没有abstract修饰的方法,那么这个类定义成abstract类有意义吗?
没有必要的!!!无意义的!!!
5 .final
final修饰的成员变量
final修饰的成员变量定义时必须初始化,并且赋值之后无法修改,一般用于类内带有名字的常量使用
final修饰的成员方法
final修饰的成员变量不能被子类重写,为最终方法,可以用于一些安全性方法的定义
final修饰的局部变量
final修饰的局部变量一旦被赋值,不能修改!
final修饰的类
final修饰的类没有子类,不能被继承。
abstract修饰的类不能被final修饰。
6.static(公用)
静态变量
1. 静态成员变量是使用static修饰的成员变量,定义在内存的【数据区】
2. 静态成员变量不推荐使用类对象调用,会提示警告
The static field SingleDog.info should be accessed in a static way
使用static修饰的SingleDog类内的info成员变量,应该通过静态方式访问
3. 静态成员变量使用类名调用是没有任何的问题。【墙裂推荐方式】
4. 在代码中没有创建对象时,可以通过类名直接使用静态成员变量,和【对象无关】
5. 代码中对象已经被JVM的GC销毁时,依然可以通过类名调用静态成员变量,和【对象无关】
6. 不管通过哪一种方式调用静态成员变量,修改对应的静态成员变量数据,所有使用到当前静态成员变量的位置,都会受到影响。
静态方法
- 静态成员方法推荐使用静态方式调用,通过类名调用【墙裂推荐的】
不推荐使用类对象调用,因为【没有对象】- 静态成员方法中不能使用非静态成员 ==> (非静态成员方法和非静态成员变量)
因为【没有对象】- 静态成员方法中不能使用this关键字
因为【没有对象】- 静态成员方法中可以使用类内的其他静态成员【难兄难弟】
- 静态成员方法中可以通过new 构造方法创建对象
单身狗可以找对象
不能挖墙脚但是能自己找
补充知识点:
static
1.类似于一块公共区域,谁都可以使用,谁都可以改变,但是不属于任何人。
2.静态成员变量:直接类名调用。
3.和对象无关
4.静态成员方法:类名直接调用
不能使用非静态成员(因为没有对象, )
不能使用this
可以自己找对象
静态的特点:
1.随着类的加载而加载 也就是,说静态会随着类的消失而消失,说明静态的生命周期最长
2.优先于对象的存在 明确一点:静态是先存在的对象是后存在的
3.被所有对象共享
4.可以直接被类名多调用
实例变量和类变量的区别
1.存放位置
类变量随着类的加载存在于方法区中,实例变量随着对象的对象的建立存在于堆内存里
2.生命周期
类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失
实例变量随着“对象”的消失而消失
静态的使用注意事项:
1.静态方法只能访问静态成员(包括成员变量和成员方法)
非静态方法可以访问静态也可以访问非静态
2.静态方法中不可以定义this,super关键字
因为静态优先于对象存在,所以静态方法中不可以出现this,super关键字
3.主函数是静态的。
静态代码块