目录
一、访问修饰符
1.1 包
作用:
- 区分相同名字的类
- 当类较多时,可以很好的管理类
- 控制访问范围
package org.example
package关键字,表示打包;org.example表示包名
实质就是创建不同文件夹/目录来保存类文件
- 使用同一个包中的类时,不需要导包
- 使用Java.lang包中的类时,不需要导包
- 其余情况都需要导包
- 如果同时使用两个包中的同名类,需要用全类名
1.2 访问修饰符
- 公开级别:用 public 修饰,对外公开
- 受保护级别:用 protected 修饰,对子类和同一个包中的类公开
- 默认级别:没有修饰符号,向同一个包的类公开.
- 私有级别:用 private 修饰,只有类本身可以访问,不对外公开
只有默认的和public才能修饰类
二、面向对象三大特征
2.1 封装
实现步骤:
- 将属性进行私有化private
- 提供一个公共的set方法,用于对属性判断并赋值
- 提供一个公共的get方法,用于获取属性的值
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.setAge(14);
System.out.println(person.getAge());
}
}
class Person {
private String name;
private Integer age;
public void setAge(Integer age){
if(age<0){
System.out.println("年龄不能小于0");
} else if (age>150) {
System.out.println("您可以飞升了");
}else{
this.age=age;
}
}
public Integer getAge(){
return age;
}
}
14
set/get方法可以写在构造器内
2.2 继承
继承可以解决代码复用
,
让我们的编程更加靠近人类思维
.
当多个类存在相同的属性
(
变量
)
和方法时
,
可以从这些类中抽象出父类,
在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过
extends
来声明继承父类即可
![](https://i-blog.csdnimg.cn/blog_migrate/d371c1d6341da105037ea53e1c98d27d.png)
基本语法:
class 子类 extends 父类{
}
- 子类就会拥有父类定义的属性和方法
- 父类又叫超类,基类
- 子类又叫派生类
public class Person {
private String name;
private Integer age;
public void info(){
System.out.println(name+age);
}
public String getName(){
return name;
}
}
public class Student extends Person{
public void testing(){
System.out.println(getName()+"正在考试");
}
}
2.2.1 子类到底能继承父类中的哪些内容
非私有 | private | |
构造方法 | 不能 | 不能 |
成员变量 | 能 | 能(不能直接用) |
成员方法 | 能 | 不能 |
成员变量的继承的内存图(P126)
1.加载字节码文件时也会把父类的字节码文件加载到方法区
2.创建对象时,会有一部分空间存储从父类继承过来的成员变量。
成员方法的继承的内存图(P126)
虚方法:不被private,static及final修饰的方法
因为private无法加载到虚方法表,因此无法被子类继承
2.2.2 继承中成员变量及成员方法的访问特点
2.2.2.1 成员变量的访问特点:
就近原则,谁离我近,我就用谁。
先从局部变量找,本类成员位置找,父类成员变量找,逐级往上
2.2.2.2 成员方法的访问特点:
就近原则,谁离我近,我就用谁。
2.2.2.3 构造方法的访问特点:
- 父类中的构造方法不会被子类继承
- 子类中所有的构造方法默认先访问父类的无参构造(给父类中的属性默认初始化),再执行自己。因为子类在初始化的时候,有可能需要用到父类中的数据,如果父类没有初始化,子类则无法使用父类的数据。子类初始化之前,一定要调用父类构造方法来完成父类数据空间的初始化。
- 子类构造方法的第一行默认为super(),不写也存在,且必须在第一行。
- 如果想调用父类的有参构造,必须手动写super进行调用
2.2.1 继承细节。
- 子类继承了所有的属性及方法,非私有的可以在子类直接访问,私有的需要通过父类的公共方法来访问
- 子类必须调用父类的构造器,完成父类的初始化
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
- 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
- super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
- super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
- java 所有类都是 Object 类的子类, Object 是所有类的基类.
- 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)
- 子类最多只能继承一个父类(指直接继承),即 java