面向对象语言的三大特征
封装
一般意义的封装,例如将重复出现的代码抽取了一个函数,称为代码的封装(包装)
面向对象的封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是 通过该类提供的方法来实现对隐藏信息的操作和访问 ,方便加入控制语句,主动权就在我们类手中.
封装案例1
public class Person {
//将成员变量属性设为私有
//封装案例1----->将类中成员变量属性私有化
private String name;
private int age;
//在本类中,用方法给私有成员变量赋值
//向外提供一个公共的方法,可以加入控制语句
public void setName(String name){
if(name.length()>=2&&name.length()<=6){
this.name=name;
}
}
//获取
public String getName(){
return this.name;
}
public void setAge(int age){
if(age>=0&&age<200){
this.age=age;
}
}
public int getAge(){
return this.age;
}
}
封装案例2:
- 将类的方法私有化
public class Window {
//在类加载时只创建一个唯一的对象
private static Window window=new Window();
//将构造方法私有化,在外界就不能随意调用了
private Window() {
}
//向外界提供获得此对象的方法
public static Window getWindow(){
return window;
}
}
public class Testwindow {
public static void main(String[] args) {
System.out.println(Window.getWindow());
System.out.println(Window.getWindow());
}
}
补充变量的分类
数据类型:
基本类型变量 byte short int long float double char boolean 8种关键字声明的
引用类型变量: 类 数组持有的是对象的引用地址
按照位置分:
成员变量: 定义在类中,可以使用权限修饰符修饰
在构造方法中进行自动的初始化赋值
生命周期:
非静态:随着对象的创建,随着对象的销毁而销毁
静态的: 随着类的加载而加载, 随着类的销毁而销毁局部变量:定义在方法中,不可以 使用权限修饰符修饰
存储位置:
非静态:堆
静态:方法区
局部变量:
定义在方法中,不可以使用权限修饰符修饰
必须我们自己进行初始化
生命周期: 方法调用创建,方法运行结束销毁
存储位置:栈
继承
就是将同一类事物中共性的属性和行为进行抽取,定义在一个类中(基类)
其他类可以继承基类,就可以拥有基类中的功能
实现代码复用性
以及可以在子类中扩展子类直接特有的功能,而不影响其他类
只要符合is-a(什么是什么)的关系
优点:
- 继承的出现减少了代码冗余,提高了代码的复用性。
- 继承的出现,更有利于功能的扩展。
- 继承的出现让类与类之间产生了is-a的关系,为多态的使用提供了前提
当一个类没有显示的继承,那么这个类默认继承字Object类
Object类是java类体系中最大的类,Object之上没有最大的类
继承的细节
- 子类继承父类后,拥有父类成员变量和方法,但不能直接访问父类的私有私有成员
- 在Java 中,继承的关键字用的是“extends”,表示子类是对父类的扩展
- Java支持多层继承(继承体系)
- 一个父类可以同时拥有多个子类
- Java只支持单继承,不支持多重继承
方法重写:
当父类中方法的实现不能满足子类需求时,可以在子类中对父类的方法进行重写,
这样调用时就会掉用子类中的方法
方法重写的要求:
子类重写的方法的结构 与 父类方法的结构必须一致
方法名,参数列表,返回值必须一致
访问权限必须大于或等于父类方法访问权限
//子类中的方法
@Override
public void eat(){
System.out.println("狗吃骨头");//重写(覆盖)父类中的方法
}
//父类中的方法
public void eat(){
System.out.println("在吃东西");
}
//@Override是java中的一个注解标签,定义在重写方法上面,表示此方法是从父类重写而来的
//也可以不用添加,只要重写的方法结构与父类一致,也算正确的重写
//建议保留:1.编译器进行语言验证,2.阅读代码时,明确知道此方法是重写
Super关键字
在Java类中使用super来调用父类中的指定操作:
- super可用于访问父类中定义的属性
- super可用于调用父类中定义的成员方法
- super可用于在子类构造器中调用父类的构造器
在子类的构造方法首先调用父类的构造方法, 不写默认存在
public Dog(){
super();//在子类的构造方法首先调用父类的构造方法, 不写默认存在
System.out.println("Dog类的构造方法");
}
抽象类
抽象方法:只有方法声明,没有具体实现方法
抽象类: 使用abstract修饰的类就是抽象类 一个类中如果包含抽象方法,那么这个类型必定是抽象类,一个类是抽象类,不一定包含抽象方法 抽象类中 特点: 抽象类不能创建对象,其他功能与正常类相同,可以有成员变量,成员方法,构造方法 主要就是在上层定义功能,让子类继承实现 一个子类入伙继承了抽象类,要么重写抽象类中所有的抽象方法,要么将该类定义为抽象类
public abstract class Animal {
private String name;
private int age;
public Animal(){
}
public Animal(String name,int age){
this.name=name;
this.age=age;
}
/*
抽象方法,没有方法,使用abstract修饰
只定义,不做操作
*/
public abstract void eat();
public void sleep(){
System.out.println("睡觉");
}
}