12.11
1 Java深入面向对象
1.1 面向对象特性
1.1.1 三大特征说明:
封装
继承
多态
1.1.2 包定义和导入
- 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间
- 包的作用:
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 包也提供了限定了访问权限的一个控制范围,拥有包访问权限的类才能访问某个包中的类
1.1.3 类访问修饰符:
Public:任何位置
Default: package 包级别,即同一个包下可以访问.
1.1.4 成员访问修饰符
1.2 封装
1.2.1 概念:
每个属性都可以生成对应的两个方法setter/getter;
Setter用来赋值;
Getter是用来取值的。
1.2.2 实现代码:
package day008;
/**
* 对信息封装"; 1.属性私有化,外部不能直接访问,但是为了我们的程序运行,用2步 2.提供”公共“的方法来访问私有的属性。
* 3.可以在方法中加入一些判断
*
* @author admin
*
*/
public class Person {
// 表示这个name是私有化
private String name;
private int age;
/**
* 提供公共的方法来访问私有属性: 给属性进行赋值
*
* @param name
*/
public void setName(String name) {
if(name == null)
{
name ="默认值";
}
this.name = name;
}
/**
* 公共方法的功能是访问私有的属性,获取私有属性的值并返回
*
* @return
*/
public String getName() {
return this.name;
}
}
package day008;
public class TestPerson {
public static void main(String[] args) {
Person p = new Person();
p.setName(null);
System.out.println(p.getName());
}
}
1.2.3 练习:
创建一个班级类,班级类中的属性分别为编号,名称,简介;
使用封装的思想,为这个类属性提供公共的访问方法;
创建测试类,创建班级类对象,对属性进行赋值,输出属性的信息。
toString ?自己决定
1.3 继承
1.3.1 引入:
- 引入继承,实现了代码重用
- 引入继承,实现了递增式的程序设计
- 能减少代码和数据的重复冗余度,并通过增强一致性来减少模块间的接口和界面,从而增强了程序的可维护性
- 能清晰地体现出类与类之间的层次结构关系
1.3.2 规约:
如果有两个类A 类B,满足 A[Dog] 是B[Animal] 的关系,我们就可以说 A 继承了 B,或者A 扩展 B,
- 使用关键字extends 来表示继承关系 A extends B
- 我们称A 类为子类[派生类]; B为父类[超类 基类]
- Java中类 只支持单继承; 一个类,只能有一个直接的父类;
- 子类会继承父类中公共【非private】成员[公共属性;公共的方法]; 在子类对象中,就可以直接使用父类中的公共属性和方法. 构造方法不能被继承.
- 创建子类对象,默认会调用父类的无参数的构造,而且,父类的无参数的构造,先于子类的构造执行。
- 如果父类中包含一个带参数构造,那么无参数构造没有显式声明的话,那么父类就不存在无参数构造;此时子类如果想调用父类的带参数的构造,就要在子类的构造中使用 :
Super(参数);而且,这个super语句必须出现在子类构造的第一行.
1.3.3 继承语法:
1.3.4 继承练习:
创建一个老师类[父类];老师类老师名字;包含了一个上课的方法;
Java老师[子类]继承老师;
C#老师[子类]继承老师;
创建测试类,实例化Java老师对象;C#老师对象,调用父类老师的方法.
1.3.5 子类构造调用父类:
1.3.6 子类显式调用父类构造:
1.3.7 Super关键字
super关键字:
super关键字用在子类中;
可以用在子类的构造方法中;调用父类的构造方法 super(); 必须是子类构造中个第一行代码;
放在子类的普通方法中,可以调用父类的公共的方法: super.父类方法名();
1.3.8 方法的重写:
我们希望子类中的方法依然和父类方法的声明形式一样,但是具体方法体却不同,这种做法就叫做方法覆盖。也称为方法的重写。
1.3.9 引用和对象:
1.3.10 多层继承:
1.3.11 再说继承:
package com.exts;
public class Animal {
String name="animal~";
String type="animal type~!";
public void t() {
System.out.println("animal的普通方法");
}
public void t2() {
System.out.println("animal的普通方法t2");
}
}
package com.exts;
public class Pig extends Animal{
String color;
String name="Pig~";
@Override
public void t() {
System.out.println("Pig 普通方法 t方法,@override");
}
public void t3() {
System.out.println("Pig的普通方法T3");
}
}
package com.exts;
public class TestAnimal {
public static void main(String[] args) {
// Animal类引用 指向是 Animal的对象
// 引用 = new 类型();
//父类引用 指向 父类对象
//通过引用调用的属性和方法都是和父类相关的.
Animal animal = new Animal();
System.out.println(animal.name);
animal.t();
System.out.println("*****************");
//子类引用 指向 子类对象
//此时子类中定义了name t() 所以调用此时都是子类的属性和方法
//子类有,就调用子类的
Pig p = new Pig();
System.out.println(p.name);
p.t();
//"子类没有",在访问修饰符允许的范围(能引用到),就调用父类的属性
System.out.println(p.type);
p.t2();//调用父类的方法
System.out.println("*****************");
//父类引用 指向 子类对象(向上转型)
Animal apig = new Pig();
//此时属性的值,都是"父类"中属性定义的值(不管子类中是否有同名的属性);
System.out.println(apig.name);
System.out.println(apig.type);
//方法
//Pig 普通方法 t方法,@override
//由于子类中队t方法进行了重写,所以此时调用的是子类中的方法
apig.t();
//父类有,子类没有重写 ;这个t2只有在父类中有定义,只能是父类的方法
apig.t2();
System.out.println("*****************");
//子类 引用 指向 父类对象(这种情况下,不可行)
// java.lang.ClassCastException:
//com.exts.Animal cannot be cast to com.exts.Pig
//不能直接"硬转"
Pig pAnimal = (Pig)new Animal();
}
}
1.4 多态
1.4.1 定义:
Java中多态性指允许不同类的对象对同一消息(同一个方法)做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式
发送消息就是方法调用
现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在IE界面下弹出的浏览器的帮助文档;如果当前在 Word 下弹出的就是 office帮助;在 Windows 下弹出的就是 Windows 帮助和支持
可见,同一个事件发生在不同的对象上会产生不同的结果,因此,多态的主要作用适用于消除类型之间的耦合关系。
1.4.2 分类:
编译时多态:主要是方法的重载,通过参数列表的不同来区分不同的方法。
在程序编译期间,
根据参数列表不同,来决定最终绑定哪个方法进行调用的操作也称为重载;编译器完成判断。
运行时多态【继承和接口】:也叫作动态绑定,一般是指在执行期间(非编译期间)判断引用对象的实际类型,根据实际类型判断并调用相应的属性和方法。主要用于继承父类和实现接口时,父类引用指向子类对象。
1.4.3 编译时多态
同一个对象,方法名相同,参数不同,执行过程和结果也不同。
1.4.4 继承实现多态(运行时)
运行时多态: 程序再运行期才确定,要执行那个对象的方法,称为运行时多态。
继承
重写覆盖
对象向上造型-父类引用指向子类对象
操作步骤:
- 创建父类,定义方法:
- 创建子类重写父类的方法:
- 场景类中,有一个方法,父类引用作为参数:
- 实际调用的时候传递的参数为子类对象
上面的案例,我们发现,方法名就叫show,但是不同的对象:
New Tiger()->=执行就是tiger的方法;
New Lion() -> 执行这个方法就是调用 lion的方法;
而lion和tiger的方法执行过程和结果是不同的。
相同的方法,对于不同对象来调用,执行过程和结果是不同的。这称为多态。
1.4.5 课堂练习:
2选1
上面的案例,自己去实践一下。
去自定义一个应用场景,使用的操作步骤和我们上面的步骤一致;
1.5 抽象类和抽象方法:
抽象类与抽象方法.
在面向对象的概念中,知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如形状类是抽象的类,圆、三角形等是具体类
用abstract修饰的类就是抽象类。
抽象类是抽象方法的容器,如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。抽象类中也可以包含有非抽象的方法甚至抽象类中可以没有抽象方法(只要一个类不应该有具体对象,就应该是抽象类,不一定是有抽象方法的)
- 抽象类可以包含普通方法吗? 可以的
- 抽象类中可以包含抽象方法吗? 是
- 抽象类的普通方法能否被子类继承? 能
- 抽象类中可否有显式的构造方法? 有,依然遵循继承关系
- 一个类继承了抽象类,能否不实现抽象类的抽象方法? 可以,但是要继续抽象
- 抽象类中可以包含属性吗? 可以的
- 使用场景主要是一些抽象概念性内容定义: 形状,门 ;主要用来做模板,标准;也就是定义了一个方法的签名,具体实现留给子类;
1.5.1 步骤:
1.5.2 要求:
创建一个抽象形状类,里面有两个抽象方法,计算面积,计算周长。
创建两个子类,分别为圆形和正方形,在子类中实现[重写]父类抽象方法。
测试类,创建子类对象,调用方法输出结果
1.6 修饰符:final
1.6.1 常量:
1.6.2 方法:
如果用来修饰一个方法,表示这个方法不能被重写。
1.6.3 类:
final来修饰一个类,表示这个类不能被继承。
例如: java.lang.String就是final类;大家可以找找其他的final类.
1.7 修饰符static:
1.7.1 修饰类:
1.7.2 修饰方法:
1.7.3 修饰属性:
1.7.4 Static import:
1.8 接口:
1.8.1 引入:
实现多继承;
设计,标准制定。
1.8.2 定义语法:
成员变量方面,在接口中只存在公开静态常量(即便没有使用static final修饰,Java也会默认确定其性质)
成员方法方面,在接口中只存在公开抽象方法(即便没有abstract修饰,Java也会默认其抽象性质)
package day12;
/**
* interface 关键字
* 接口不能直接实例化
*
* @author Administrator
*
*/
public interface IA {
//1 公共常量
// The blank final field a may not have been initialized
// int a; //和类不同的地方
int a = 1;
final int b = 1;
static final int c = 1;
public static final int d = 1;
//2 抽象方法
public abstract void t1();
abstract void t2();
void t3();
//3 默认方法
default void t4() {
System.out.println("jdk1.8 default method!");
}
//4 静态方法
static void t5() {
System.out.println("static method!");
}
}
规约:
一个类可以实现多个接口:
Class 类名 implements 接口1,接口2,接口3 …
类中要实现接口中的抽象方法。
或者不实现的话,这个类就要定义为抽象类.
package com.inters;
/**
* 接口不能直接进行实例化
* @author Administrator
*
*/
public interface IFly {
void fly();
}
package com.inters;
public interface IEat {
void eat();
}
package com.inters;
/**
* implements 实现 @Override重写接口的方法
*
* @author Administrator
*
*/
public class Bird implements IFly, IEat {
@Override
public void fly() {
System.out.println("笨鸟在飞");
}
// alt+/
@Override
public void eat() {
System.out.println("笨鸟在吃虫子");
}
}
package com.inters;
public class TestBird {
public static void main(String[] args) {
Bird bird = new Bird();
bird.eat();
bird.fly();
IFly bird2 = new Bird();
bird2.fly();
}
}
一个接口能继承一个接口吗?
一个接口可以继承多个接口吗?
如果一个类,继承了类同时有实现了接口,语法是什么样子的?
1.8.3 接口和抽象类区别:
1.8.4 类实现接口:
1.8.5 接口应用[多态]:
1.9 枚举:
package enumdemo;
public enum EnumSex {
男, 女, 保密
}
package enumdemo;
public enum Color {
// 7个颜色
Red("红色", 1), Green("绿色", 2), Blue("蓝色", 3);
private String name;
private int index;
private Color(String name, int index) {
this.name = name;
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
1.10 关联和依赖:
- 两个类之间的简单关联表示了两个同等地位类之间的结构关系。当你想要表示结构化关系时使用关联
- 关联表示has-a关系,如学生拥有一个课程,往往表现为B作为A的属性存在(A关联B)
- 最典型的一对一关系莫过于人和证件之间的关联,例如:一个人只能有一个驾照,而一个驾照只能归属与一个人:
- 人还可以跟其他事物构建一对多的关联关系,比如将驾照换为荣誉证书,那么一个人可以有多个荣誉证书,我们可以使用数组或集合来描述这个关系:
- 依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物,反之不成立
- 此关系最为简单,也最好理解,所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用
- 依赖体现了“ use a”关系
- 依赖关系一般使用方法的参数体系
- 一个人自创生就需要不停的呼吸,而人的呼吸功能之所以能维持生命就在于吸进来的气体发挥了作用,所以说空气只不过是人类的一个工具,而人并不持有对它的引用。
1.11 2-28回顾:
- 继承: 类A is 类B,那么我们就说A继承了B;使用extends来表示,继承,也称为扩展;A称为子类,将B称为父类。A称为派生类,B称为基类,超类。
- 子类可以继承父类公共成员,公共的属性和方法。
- 除了子类可以继承父类的成员以外,我们子类可以自己扩展;子类可以重写父类的方法,也可以有自己的方法;可以继承父类公共的属性,也可以有自己的属性。
- 重写:覆写,覆盖。子类中对父类的方法进行重新的定义;但是要求子类的方法修饰符返回值类型方法名,参数列表和父类一致; 如果返回值为引用类型,那么子类返回值的类型是父类方法返回值的子类也可以; 子类方法的修饰符不能小于父类方法访问修饰符。
- 多态: 允许不同类的对象对同一消息做出相应; 同一方法,对于不同的对象来说,执行过程和方法不同;
吃: 人:[大人 小孩 猪 ]
- 继承来完成多态的方式:
创建父类;创建父类的方法;创建子类,重写父类的方法;父类引用作为参数;传递子类对象给方法;
Eg:昨天的作业:
- 父类引用指向子类对象:
- 抽象类和抽象方法;
- 修饰符final: final class不能被继承;final 属性是常量;final方法 不能被重写。
- 访问修饰符: private default protected public . 口述
1.12 广告时间:
Plantuml:
统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。
https://plantuml.com/zh/eclipse

浙公网安备 33010602011771号