JAVA中封装与继承重点总结
一、修饰类
Public: 类class ß 公共的,任何都能访问
默认: 类class ß 包级私有访问(同包内可用)
类成员的访问修饰:
作用域 |
同一类中 |
同一包中 |
子类中 |
任何地方 |
修饰符 |
|
|||
Private |
可以 |
不可以 |
不可以 |
不可以 |
默认修饰符 |
可以 |
可以 |
不可以 |
不可以 |
Protected |
可以 |
可以 |
可以 |
不可以 |
Public |
可以 |
可以 |
可以 |
可以 |
二、修饰类成员
Private(私有的) 本类
默认(同包内可用) 本类、同包
Protected(受保护的) 本类、同包、不同包的子类(访问修饰符大于默认)
Public(公共的) 任何地方
Public>protected>默认>private
Static 修饰符(静态的)
Static 可以用来修饰:
- 成员变量:静态变量,可以直接通过类名访问
- 成员方法:静态方法,可以直接通过类名访问
- 代码块:静态代码块,当Java虚拟机加载类时,就会执行该代码块
Static 变量
- 类变量:静态变量
Public class Student{
Public static String email{}
}
调用的时候用类名就可以调用
System.out.pringln(Student.email);(点出来的时候图标上会有一个红色的小s)
被static修饰的变量
在内存中只有一个拷贝
类内部,可以在任何方法内直接访问静态变量
其他类中,可以直接通过类名访问
- 实例变量
没有被static修饰的变量
Public class Student{}
每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响
实例变量和类变量的区别:
- 实例变量不使用static去修饰,而类变量要用static修饰
- 一旦使用static 修饰变成类变量,就可以用类名直接调用;
Student stu = new Student();
stu.email;
而不用static修饰的实例变量,必须用实例调用
student.email;
- 类变量在内存中只有一个拷贝
Java虚拟机只给static变量分配一次一个内存
static变量的作用:
1. 能被类的所有实例共享,可作为实例之间进行交流的共享数据
2. 如果类的所有实例都包含一个相同的常量属性,可把这个属性定义为静态常量类型,从而节省内存空间
3. 方法里不能定义静态变量
静态变量只能在类里定义
方法里只能调用静态变量
static方法:
静态方法:可直接通过类名访问
类名直接调用就是静态的
student.method();
- 静态方法中不能使用this和super
- 不能直接访问所属类的实例变量和实例方法
- 可直接访问类的静态变量和静态方法
实例方法:通过实例访问
可直接访问所属类的静态变量、静态方法、实例变量和实例方法
静态方法必须被实现
Static代码块:
JVM加载类时,加载静态代码块
- 如果有多个静态块,按顺序加载
- 每个静态代码块只会被执行一次
使用继承
- 编写父类
[访问修饰符] class Pet{
//公共的属性和方法
}
- 编写子类,继承父类
继承关键字
[访问修饰符]class Dog extends Pet {
//子类特有的属性和方法
}
继承是Java中实现代码重用的重要手段之一。Java中 只支持单根继承,即一个类只能有一个直接父类
继承pet 父类 (Java中一个父类可以有多个子类,子类只能有一个父类)
名字+ extends + pet字类 可以用父类里面的东西 可以避免代码重复命名
super(传参) 调用父类构造方法。只能写一句,必须写在第一句
this(传参) 调用当前的构造方法
调用字类的,就会先调用最高的类,然后再依次往下构造(不管没有特殊指明父类的那一个都会遵循这个法则)
子类 继承父类所有的属性和方法(private除外)
会调用父类的构造方法,如果没有明显调用则调用默认空间构造方法
class类{
private 属性
public get/set
空构造
带参构造
方法
}
子类继承父类的什么?
- 继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
- 继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里
子类不能继承父类的什么?
- Private成员
- 子类与父类不在同包,使用默认访问权限的成员
- 构造方法,但是可以调用
子类访问父类成员:
访问父类构造方法:
super();
super(name);
访问父类属性:
super.name;
访问父类方法:
super.print();
1. 使用super关键字,super代表父类对象
2. 在子类构造方法中调用且必须是第一句
3. 不可以访问父类中定义为private的属性和方法
小结:
- super关键字来访问父类的成员
- super只能出现在子类的方法和构造方法中
- super调用构造方法时,只能是第一句
- super不能访问父类的private成员
继承条件下的构造方法:
继承条件下构造方法的调用规则:
- 子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法(系统默认调用父类的无参构造方法)
- 子类构造方法通过super显式调用父类的有参构造方法(执行父类相应构造方法,而不执行父类无参构造方法)
- 子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则
快捷键:alt + shift + s
Java只支持单根继承:
一个类只能有一个直接父类
一个类可以有多个间接父类
继承方法就是用super。
Object是Java中的祖宗类
Super的使用
- 子类方法重写父类方法
- 在子类中定义了和父类同名的成员变量
(super可以使被屏蔽的成员可见)
super和this
区别 |
This (一定要写在构造方法的首行) |
Super (包括间接的父类) |
访问属性 |
访问本类属性 如果没有则从父类找 |
访问父类中的属性 |
访问方法 |
访问本类方法 如果没有则从父类找 |
访问父类中的方法 |
访问构造 |
调用本类构造方法 放在构造方法首行 |
调用父类构造,放在子类构造方法首行 |