一、封装
1、封装概念
- 高内聚,低耦合
- 禁止直接访问一个对象中数据的实际表示,而通过操作接口来访问,这称为隐藏信息
- 属性私有,get/set
2、特点
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护性增加了
二、继承
1、基本概念
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
- extands的意思是扩展,子类是父类的扩展
- Java类中只有单继承没有多继承
- Java类所有的类都直接或者间接继承object
- 继承是类和类之间的一种关系,除此之外类和类之间的关系还有依赖,组合,聚合等
- 继承关系的两个类,一个为子类(派生类)一个为父类(基类),子类继承父类,使用关键字extends来表示
- 子类和父类之间从意义上讲应该具有“is a”的关系
2、super
子类默认调用父类的无参构造
1
super()
- super() 必须在第一行
调用父类的属性,方法
1
2
3
4
5
6
7
8
9
10public void test(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
public void test1(String name){
say();
this.say();
super.say();
}注意点
- super调用父类的构造方法.必须在构造方法的第一个
- super 必须只能出现在子类的方法或者构造方法中
- super和 this不能同时调用构造方法!
super与this区别
- 代表的对象不同
- this:本身调用者这个对象
- super:代表父类对象的应用
- 前提
- this:没有继承也可以使用
- super:只能在维承条件才可以使用
- 构造方法
- this();本类的构造
- super():父类的构造
- 代表的对象不同
三、重写
1、静态方法
- 方法的调用和左边定义的类有关
2、非静态方法
- 父类的引用指向子类,子类重写的父类的方法
3、重点:需要有继承关系,子类重写父类的方法
- 方法名必须相同,方法体可以不同
- 参数列表必须相同
- 修饰符:子类范围可以扩大,不能缩写。public ->protected->default->private
- 抛出异常:范围可以被缩小,不能扩大。
- 重现原因:父类功能不能完全满足子类的需求
四、多态
1、定义:
- 同一方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
2、注意事项
多态是方法的多态,属性没有多态
父类型和子类型转换要有联系,不能随意转换-》类型转换异常
存在条件:要有继承关系,方法需要重写,父类引用指向子类对象!
1
Father f1 = new Son();
不能重写的方法关键字
- static 方法: 属于类,它不属于实例
- final : 常量
- private 方法
3、instanceof(类型转换)引用类型
1 | Object o = new Student(); |
4、对象转换
- 父类引用指向子类的对象
- 把子类转换成父类,向上转型
- 把父类转换子类,向下转型
- 方法调用,减少重复的代码!
5、static
静态方法,静态属性
静态变量(类变量)
1
2
3
4
5
6
7
8
9
10
11
12
13public class Student {
private static int age;//静态变量
private double score;//非静态变量
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(Student.age);
//System.out.println(Student.score);//报错
System.out.println(s1.age);
System.out.println(s1.score);
}
}
静态方法可以直接调用,非静态方法需要new之后调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class Student {
private static int age;//静态变量
private double score;//非静态变量
public void run(){
}
public static void go(){
}
public static void main(String[] args) {
Student s1 = new Student();
(new Student()).run();
go();
}
}静态代码块
1
2
3
4
5
6
7
8
9
10
11
12
13public class Person{
// 匿名代码块
// 实例化时运行
{
System.out.println("匿名代码块");
}
// 静态代码块
// 创建person的时候只调用一次
static{
System.out.println("静态代码块");
}
}1
2
3
4
5
6
7
8Person p1 = new Person();
Person p2 = new Person();
//输出
/*
静态代码块
匿名代码块
匿名代码块
*/静态导入包
1
2
3
4
5
6
7import static java.lang.Math.random;
public class Person {
public void test(){
System.out.println(random());
}
}