封装
概念 : 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的好处 :
- 只能通过规定的方法访问
- 隐藏类的实现细节
- 方便加入控制语句
- 方便修改实现
public class Demo{
//属性用private权限
private String name;
//方法用public权限
public String getName (){
return name;
}
public void setName(String name){
this.name = name;
}
}
this关键字
this关键字代表自身类的对象
使用this关键字引用成员变量
使用this关键字引用成员方法
PS : this关键系字必须放在非静态方法里面
在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。
public class Demo{
private int a;
//成员变量名与局部变量名相同
public Demo(int a){
this.a = a;
}
//用getter方法得到变量
public int getA(){
return a;
}
//用setter方法设置变量
public void setA(int a){
this.a = a;
}
}
继承
继承是面向对象程序设计不可缺少的设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径.
继承是从已有的类中派生出新的类,新的类能吸收已有类的属性和行为,并能扩展新的能力.
- 在java中使用extends关键字来表示继承关系
- java不支持多继承,单继承使用java的继承关系很简单,一个类只能有一个直接的父类
- 继承之后子类可以调用父类的所有非私有属性和非私有方法
继承与现实世界相类似,具体思想就是父类下分有具体的子类,在父类中存放子类共有的属性和方法.
继承是代码重用的一种方式
**继承的形式 **
[访问权限修饰符] [修饰符] 子类名 extends 父类名{子类体}
以一个动物类举例 :
//父类
public class Animal{
public void eat(){}
}
//子类
public class Dog extends Animal{
public void play(){}
}
/*子类对象可以直接调用父类的方法和属性
Dog类是 Animal类的子类, Animal类是Dog类的父类
Dog类是 Animal类的派生类, Animal类是Dog类的基类
继承的传递性 :
C类从B类继承,B类又从A类继承
那么C类就具有B类和A类的所有非私有属性和非私有方法
当一个没有继承任何一个类时, jvm 会默认让类继承Object类
Object是 java为所有类提供的基类
继承中的构造方法
子类构造方法总是先调用父类构造方法,默认情况下,调用父类无参构造方法
可以在子类构造方法的第一行,使用super关键字调用父类任意一个构造方法
如果用super,必须写在方法的第一句
如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法。
原因:子类创建后需要调用父类的方法,所以在创建子类对象时父类也需要同时被创建
//父类
public class Animal {
private String name;
private int age;
public Animal() {
System.out.println("Animal类中无参的构造方法");
}
public Animal(int age){
System.out.println("有参的构造方法");
}
}
//子类
public class Dog extends Animal {
String name;
private String type;
public Dog() {
//通过super关键字调用父类中有参的构造方法
super(12);
}
}
super关键字的用途
super关键字代表父类的引用,在程序中主要用途 :
- 在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。
- 用"super.成员变量名"来引用父类成员变量
- 用"super.方法名(参数列表)"的方式访问父类的方法。
- 与this的区别,this通常指代当前对象,super通常指代父类。
方法的重写
在子类中可以根据需要对从基类中继承来的方法进行重写。
方法重写规则 :
- 方法名相同、参数列表相同;
- 返回值类型相同;
- 访问权限等于或大于父类权限;
PS : 构造方法不能重写
应用场景 :
当父类的方法实现不能满足子类需求时,可以对方法进行重写( override)
//父类
public class Animal {
public void eat(){
System.out.println("啃骨头");
}
}
//子类
public class Dog extends Animal {
/*
父类中的实现方式不能满足子类需求时
方法重写:当子类中的实现步骤与父类中的实现方式不同时,可以在子类中将父类中的方法重写,(覆盖)
重写的要求:
子类方法的结构与父类相同(完全相同,重载不算)
*/
@Override
public void eat() {
System.out.println("吃肉");
}
}
类之间的关系
关联关系
对象和对象之间的连接,在java中,关联关系的代码表现形式为一个类作为另一个类的属性类型存在.
关联关系分为单向关联和双向关联
- 单向关联: A类关联B类
- 双向关联:A类关联B类,B类关联A类
**一对一关联:**一个学生,只能在一个班级里学习
//班级类
public class Classes{
//Classes类关联student类. student类作为Classes类的属性
private Student cla;//班级
}
//学生类
public class Student{
}
**一对多关联:**一个学生,可以参加多个班级学习。
解决一对多的关联的方案
- 集合
- 数组
依赖关系
依赖关系:
指一个类A使用到了另一个类B
依赖关系的特性
这种关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A
依赖具体变现
在代码层面,依赖关系表现为类B作为参数被类A在某个method方法中使用
public class Person {
//在Person类中Bus类被作为参数使用
public void travel(Bus bus){
}
}
依赖于关联
是"HAS"关系,依赖关系是"USE"关系
A类关联B类,指的是B类对象作为A类的属性存在,称为“has”关系。
A类依赖B类,指的是B的对象作为A类的方法参数存在,称为“use”关系
抽象类
- 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
- 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法。
- 用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。
特点 :
抽象类不能被实例化,但可以有构造函数,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象
抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类
抽象方法
抽象方法是一种特殊的方法:它只有声明,而没有具体的实现
抽象方法必须用abstract关键字进行修饰
/*
[访问权限修饰符] abstract class 类名{
成员列表
}*/
//一个抽象类
public abstract class Shapes{
//定义一个抽象方法,没有具体实现
public abstract void draw();
}
public abstract class Shapes{
//定义一个成员方法,具体实现
public void draw(){
//具体代码
}
}
抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说,设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能