-
封装
- 概念
体现:方法、类中属性私有化(private),通过公共的访问方式(get、set方法)就能正常的赋值和取值,提高代码的数据安全性。
public class FZDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建Person类对象
Person p = new Person();
p.setAge(10);
//给对象属性赋值
}
}
class Person {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private String name;
private char gender;
private int age;
}
-
继承
- 概念
多个类中的内容相同,把相同的内容放到一个新类中,让原来的类和这个新类通过extends产生了关联关系-----继承
原来的类叫做:子类、派生类
新的类叫做:父类、超类
子类可以继承父类部分信息。(解释:父类中私有信息、构造方法以及构造代码块,子类都拿不到,不能通过子类对象.出来,被protected修饰的信息,如果想要被访问到需要子类对象在子类对象的本类中使用。)
public class ExtendDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建医生对象
Docter d = new Docter();
d.name="zz";
d.treat();
}
}
//发现 类Doctor和类Nurse重复
//extends让医生护士类和YiLiao类产生了关联关系--继承
//YiLiao称之为父类、也叫超类、也叫基类
//医生护士类叫做子类、派生类
class YiLiao{
String name;
private char gender; //私有无法继承
int age;
String dept;
public void treat() {
System.out.println(name+"治病救人");
}
}
class Docter extends YiLiao{
//当出现了和父类中方法签名一样的方法
//输出的是子类的方法,叫做方法的重写
public void treat() {
System.out.println(name+"拿着手术刀治病救人");
}
}
class Nurse extends YiLiao{
// private String name;
// private char gender;
// private int age;
// String dept;
// public void treat() {
// System.out.println(name+"治病救人");
}
console:
zz拿着手术刀治病救人
-
继承的方式
-
单继承(java支持):一个子类只能有一个父类,父类可以有多个子类,JAVA类与类之间只支持单继承
-
多继承(c语言支持):
//C语言的多继承
class A{
m();
}
class B{
n();
}
//m()和n()都能拿到,极大的提高代码的复用性
class C extend A,B{}
//java单继承(类与类)
class A{
int m(){};
}
class B{
boolean m(){};
}
class C extends A,B{}
C c = new C();
//当两个父类中方法名一样 会导致方法的混用问题,为了避免这个问题出现java使用的是单继承
result = c.m();
//类与类之间是多继承好,还是单继承好,要看具体的场景,各有千秋
- 方法的重写(覆盖)
在父子类中出现了方法签名一致的方法,我们称之为方法的重写。
需要遵循方法重写的原则(两等两小一大):
1.父子类方法签名相等。
2.如果父类的方法返回值类型是基本类型/void,子类的方法返回值类型要和父类保持一致。
3.如果父类的方法返回值类型是引用类型,子类的方法返回值类型要么和父类的方法返回值类型保持一致,要么就是父类方法返回值的子类:
class A{}
class B extendsA{}
class C {
public A m(){return null;}
}
class D extends C{
public B m(){return null;}
}
4.子类的方法访问权限修饰符要么和父类的访问权限修饰符一直,要么大于父类的访问权限修饰符范围。
class A{
void m(){}
}
class B extends A{
//子类修饰符比父类大
public void m(){}
}
5.子类抛出的异常不管几个只要不超出父类异常的范围就能重写(编译时异常),运行时异常不影响。
class ED1{
//重载和异常无关系,方法重载
public void m()throws IOException {}
public void m(int i){}
}
class ED2 extends ED1{
@Override//可以重写
public void m()throws IOException{}
}
-
访问权限修饰符(控制对象访问类中属性方法)
本类 | 子类 | 同包类 | 其他类 | |
public | 可以 | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 可以 | 不可以 |
默认(不写) | 可以 |
同包子类 可以 | 可以 | 不可以 |
private | 可以 | 不可以 | 不可以 | 不可以 |
-
super关键字
-
概念
super关键字用于子类中调用父类信息(代表父类对象),所有子类的构造方法都要默认调用父类的无参构造。如果父类没有提供无参构造,子类所有的构造方法需要通过super语句去调用对应形势的父类构造。
super语句用于在子类构造方法中调用父类的构造方法,保证super语句在代码的第一行。
父类对象优先于子类对象先出现(执行顺序: 父类的构造代码块--->父类的构造方法--->子类的构造代码块--->子类的构造方法)。构造代码块和构造方法与对象同级。
super(); 是父类的构造方法。
public class ExtendsDemo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
pig p = new pig();
p.eat();
}
}
// 代表动物类
class Animal {
public Animal(String name) {}
// 方法
public void eat() {
System.out.println("在无忧无虑地吃饭.....");
}
public void sleep() {
System.out.println("在无忧无虑地的睡觉.....");
}
}
// 代表猪类
class pig extends Animal {
//无参构造
//子类的所有的构造方法默认调用父类的无参构造,先创建了父类对象,再有的子类对象
public pig(){
//super语句在子类的构造方法中调用父类的构造方法
//super和this相同要在第一行使用
//super语句和this语句不能同时出现
super("abc");
}
// 对eat方法进行重写
public void eat() {
System.out.println("在哼哧哼哧地吃....");
System.out.println("吃饱了...想睡觉...");
// 在JAVA中所有的非静态方法以及属性都可以通过对象调用
// sleep方法是一个非静态方法可以通过对象调用
// this ---代表当前类的对象
// 提供一个父类对象
// this.sleep();//底层还是通过super来调用
super.sleep();
}
}
-
多态
-
概念
代码在操作过程中体现的多种形式
java时期-----编译时期(检测语法)、运行时期(检测逻辑)
1.编译时多态----在编译时期进行代码绑定(重载)
//方法的重载就是多态的一种体现形式
public static void m(){}
public static void m(int i){}
2.运行时多态(前提是继承)----在运行时期进行代码的绑定(重写)
-----向上造型
向上造型:声明类是父类,子类是实际创建类,创建对象:(父类----目录 子类-----正文)
-
多态的优点
统一参数类型、统一方法功能调用(子类重写方法)、解耦(降低耦合度(多个模块之间的联系) 高内聚,低耦合)
- 案例练习
图形类(Shape 长和宽都是private 有参构造(用于赋值) 周长和面积方法)
矩形类(Rectangle 子类 通过有参构造赋值 计算周长和面积)
正方形类(Square 矩形类的子类(多级继承) 有参构造赋值 计算周长和面积)
圆形类(Circle 图形类的子类 有参构造赋值 计算周长和面积)
创建向上造型的对象 求出每个图形的周长和面积。
-
面向对象编程
对象的抽象化是类,类的具体化是对象,面向对象团建开发需要经过OOA(面向对象分析)、OOD(面向对象设计)和OOP(面向对象编程)三个阶段,OOA对目标系统进行分析,及案例分析模型,并将之文档化;OOD用面向对象的思想对OOA的结果进行细化,得出设计模型。OOA和OOD的分析、设计结果需要统一的符号来描述、交流并记录,UML就是这种用途,记录OOA和OOD结果的符号表示法。