封装

什么是封装?

隐藏实现细节,暴露出合适的访问方式(合理隐藏,合理暴露)

封装的实现步骤

1、一般对类的成员变量使用private(私有)关键字进行修饰隐藏,用private关键字修饰过的变量,只能在当前类中访问
2、提供public修饰的公开的getter和setter方法暴露其取值和赋值

  1. package com.osskey.fengzhuang;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. Student s = new Student();
  5. s.setAge(20);
  6. //s.getAge();
  7. System.out.println("这个学生的年龄是:"+s.getAge());
  8. }
  9. }
  1. package com.osskey.fengzhuang;
  2. public class Student {
  3. private int age;
  4. private String name;
  5. private String sex;
  6. public void setAge(int age){
  7. if (age>0 && age<100){
  8. this.age = age;
  9. }else {
  10. System.out.println("输入错误!");
  11. }
  12. }
  13. public int getAge(){
  14. return age;
  15. }
  16. }

image.png

JavaBean

JavaBean可以理解为一个实体类,他的对象可以用于在程序中封装数据

标准JavaBean需要满足的条件

1、成员变量需要用private修饰
2、提供每一个成员变量对应的setXXX()和getXXX()方法
3、必须提供一个无参构造器

继承

什么是继承?

继承是类与类之间的一种关系。子类(派生类)可以继承父类(基类,超类)的属性和方法。
继承关系在JAVA代码中如下:
public class Students extends People{} //学生类继承人类的属性和方法

继承的特点

  • 子类可以继承父类的属性和方法,但是不能继承父类的构造器
  • Java是单继承模式,一个类只能继承一个父类
  • Java不支持多继承,但是支持多层继承
  • Java中所有的类都是Object类的子类

一些疑问:

  • 子类知否可以继承父类的构造器?

不可以,子类有自己的构造器,父类的构造器用于初始化父类对象

  • 子类是否可以继承父类的私有成员变量?

其实是可以的,但是只是继承,不能直接访问,不能用

继承后:成员访问的原则

  • 在子类方法中访问成员变量(成员方法,成员变量)满足:就近原则

(1)先在子类局部范围(比如子类中的方法)中寻找要使用的成员变量
(2)然后再子类成员范围中寻找
(3)最后在父类成员范围中寻找,如果没有找到就报错

  • 如果在子类中出现了重名的成员(比如:父类和子类都出现了name变量),会优先使用子类的成员,如果一定要使用父类的成员则可以使用super关键字,指定访问父类的成员。

格式:super.父类成员变量/成员方法

  1. package com.osskey.extendsdemo;
  2. public class superdemo {
  3. public static void main(String[] args) {
  4. dog dog = new dog();
  5. dog.run();
  6. System.out.println("-----------");
  7. dog.go();
  8. }
  9. }
  10. class Aminal{
  11. public String name="这是动物类";
  12. public void run1(){
  13. System.out.println("动物类是父类");
  14. }
  15. }
  16. class dog extends Aminal{
  17. public String name;
  18. public void run(){
  19. System.out.println(super.name);
  20. }
  21. public void run1(){
  22. System.out.println("狗类是子类");
  23. }
  24. public void go(){
  25. run1();
  26. super.run1();
  27. }
  28. }

继承后:方法重写

什么是方法重写?

在继承体系中,子类出现了和父类一模一样的方法声明,就称子类的这个方法是重写的方法
如果父类里的某个方法,只能提供一部分子类的需求,但是又不能满足全部子类的需求,这时就可以利用方法重写,用super继承一部分父类方法,再加上增加的功能,组成一个新的成员方法

Override重写注释

@Override 放在重写后的方法上,作为重写是否正确的校验注解
加上该注解后,如果重写错误,编译阶段会出现错误提示

方法重写的注意事项

  1. 私有方法不能被重写
  2. 重写方法的名称,形参列表必须和被重写的方法保持一致
  3. 子类重写父类方式时,访问权限必须大于或等于父类(缺省<protected<public)
  4. 子类不能重写父类的静态方法 (为什么?方法重写的前提是首先要继承父类的被重写方法,而静态方法是不存在继承关系的,它是一种共享的方法,所以静态方法不能重写)

继承后:子类构造器的特点

子类中的所有构造器都会默认先访问父类中的无参构造器
子类构造器默认第一行是super(),不写也是默认存在的

继承后:子类访问父类有参构造器

如果父类只有有参构造器,没有无参构造器,那么子类内的构造器也必须是有参构造器,且用super()传递构造器的变量。具体声明如下:

  1. package com.osskey.extendsdemo;
  2. public class People {
  3. private String name;
  4. private int age;
  5. //只有有参构造器,没有无参构造器
  6. public People(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public int getAge() {
  17. return age;
  18. }
  19. public void setAge(int age) {
  20. this.age = age;
  21. }
  22. }
  1. package com.osskey.extendsdemo;
  2. public class Strudent extends People {
  3. //父类中没有无参构造器,子类也必须是有参构造器
  4. public Strudent(String name, int age) {
  5. /*
  6. 通过super()传递参数到父类中去
  7. */
  8. super(name, age);
  9. }
  10. }

对上面这个代码做了一些完善

  1. package com.osskey.extendsdemo;
  2. public class People {
  3. private String name;
  4. private int age;
  5. public People(String name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. public People() {
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. }
  1. package com.osskey.extendsdemo;
  2. public class Strudent extends People {
  3. private String className;
  4. //有参构造器赋值,即对父类的有参构造器赋值,也对子类内的className变量赋值
  5. public Strudent(String name, int age,String className) {
  6. super(name, age);
  7. this.className = className;
  8. }
  9. public Strudent() {
  10. }
  11. public String getClassName() {
  12. return className;
  13. }
  14. public void setClassName(String className) {
  15. this.className = className;
  16. }
  17. }
  1. package com.osskey.extendsdemo;
  2. public class testdemo {
  3. public static void main(String[] args) {
  4. Strudent stu = new Strudent("张三",18,"一班");
  5. System.out.println(stu.getName());
  6. System.out.println(stu.getAge());
  7. System.out.println(stu.getClassName());
  8. }
  9. }

image.png

this和super

image.png

this()访问兄弟构造器(本类构造器)

image.png
如果用户有输入name和schoolName参数,则使用用户输入的;如果用户没有输入schollName参数,则通过无参构造器中的this(),将默认指定的值传递给有参构造器

this()和super()使用注意

image.png

多态

什么是多态?

image.png

  1. package com.key.d13_packeg_01.duotaidemo;
  2. public abstract class Aminal {
  3. public String name = "父类动物";
  4. public abstract void run();
  5. }
  1. package com.key.d13_packeg_01.duotaidemo;
  2. public class dog extends Aminal{
  3. public String name = "子类动物";
  4. @Override
  5. public void run() {
  6. System.out.println("狗跑的很快");
  7. }
  8. }
  1. package com.key.d13_packeg_01.duotaidemo;
  2. public class cat extends Aminal{
  3. @Override
  4. public void run() {
  5. System.out.println("猫跑的很慢");
  6. }
  7. }
  1. package com.key.d13_packeg_01.duotaidemo;
  2. public class polymorphic {
  3. public static void main(String[] args) {
  4. //1、多态的形式:父类类型 对象名称 = new 子类构造器
  5. Aminal a1 = new dog();
  6. /**
  7. * 多态的方法调用:编译看左边,运行看右边
  8. */
  9. a1.run();
  10. /**
  11. * 多态的变量调用:编译看左边,赋值还看左边
  12. */
  13. System.out.println(a1.name);
  14. Aminal a2 = new cat();
  15. a2.run();
  16. }
  17. }
  18. package com.key.d13_packeg_01.duotaidemo;
  19. public class polymorphic {
  20. public static void main(String[] args) {
  21. //1、多态的形式:父类类型 对象名称 = new 子类构造器
  22. Aminal a1 = new dog();
  23. a1.run();
  24. Aminal a2 = new cat();
  25. a2.run();
  26. }
  27. }

image.png

使用多态的前提

image.png

多态的优势

image.png

多态下引用数据类型的类型转换

image.png

  1. package com.key.d13_packeg_01.duotaidemo;
  2. public class tiger extends Aminal{
  3. @Override
  4. public void run() {
  5. System.out.println("老虎跑得很快");
  6. }
  7. public void eat(){
  8. System.out.println("老虎吃肉");
  9. }
  10. }
  1. package com.key.d13_packeg_01.duotaidemo;
  2. public abstract class Aminal {
  3. public String name = "父类动物";
  4. public abstract void run();
  5. }
  1. package com.key.d13_packeg_01.duotaidemo;
  2. public class changemethod {
  3. public static void main(String[] args) {
  4. Aminal t = new tiger();
  5. //t.eat();
  6. //这里Amial类对象t无法调用eat()方法,因为eat()方法是子类tiger独有的方法,父类Aminal中没有eat()方法
  7. /**
  8. * 将Aminal类型的t强制转换为tiger类型的t1
  9. */
  10. tiger t1 = (tiger) t; //从父类类型到子类类型必须强制转换
  11. t1.eat();
  12. }
  13. }

image.png

注意的地方

image.png

  1. package com.key.d13_packeg_01.duotaidemo;
  2. public class changemethod {
  3. public static void main(String[] args) {
  4. Aminal t = new tiger();
  5. //t.eat();
  6. /**
  7. * 将Aminal类型的t强制转换为tiger类型的t1
  8. */
  9. tiger t1 = (tiger) t; //从父类类型到子类类型必须强制转换
  10. t1.eat();
  11. /**
  12. * 通过instanceof判断对象类型后再进行强制类型转换
  13. */
  14. Aminal t2 = new tiger();
  15. if (t2 instanceof tiger){
  16. tiger t3 = (tiger) t2;
  17. t3.eat();
  18. }else if (t2 instanceof dog) {
  19. dog d = new dog();
  20. d.run();
  21. }
  22. }
  23. }

image.png

多态实际应用编程

image.png

USB接口,实现类Mouse,实现类Keyboard,类Computer,测试类test

  1. package com.key.d13_packeg_01.duotaidemo.ceshianli;
  2. public interface USB {
  3. void in();
  4. void out();
  5. }
  1. package com.key.d13_packeg_01.duotaidemo.ceshianli;
  2. public class Mouse implements USB{
  3. private String name;
  4. public Mouse(String name) {
  5. this.name = name;
  6. }
  7. @Override
  8. public void in() {
  9. System.out.println("接入" + name + "鼠标。。。");
  10. }
  11. @Override
  12. public void out() {
  13. System.out.println("拔出" + name + "鼠标。。。");
  14. }
  15. public void click(){
  16. System.out.println("点击" + name + "鼠标。。。");
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. }
  1. package com.key.d13_packeg_01.duotaidemo.ceshianli;
  2. public class Keyboard implements USB{
  3. private String name;
  4. public Keyboard(String name) {
  5. this.name = name;
  6. }
  7. @Override
  8. public void in() {
  9. System.out.println("接入" + name + "键盘。。。");
  10. }
  11. @Override
  12. public void out() {
  13. System.out.println("拔出" + name + "键盘。。。");
  14. }
  15. public void type(){
  16. System.out.println("使用"+ name +"键盘打字。。。");
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. }
  1. package com.key.d13_packeg_01.duotaidemo.ceshianli;
  2. public class Computer {
  3. private String name;
  4. public Computer() {
  5. }
  6. public Computer(String name) {
  7. this.name = name;
  8. }
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. /**
  16. * 提供安装USB设备的入口
  17. */
  18. public void installUSB(USB usb){
  19. usb.in();
  20. /**
  21. * 调用独有方法
  22. */
  23. if (usb instanceof Mouse){
  24. Mouse mouse = (Mouse) usb;
  25. System.out.println("此usb设备是" + mouse.getName() + "鼠标");
  26. //usb.in();
  27. mouse.click();
  28. //usb.out();
  29. }else if (usb instanceof Keyboard){
  30. Keyboard keyboard = (Keyboard) usb;
  31. System.out.println("此usb设备是" + keyboard.getName() + "键盘");
  32. //usb.in();
  33. keyboard.type();
  34. //usb.out();
  35. }else {
  36. System.out.println("安装失败!");
  37. }
  38. usb.out();
  39. }
  40. }
  1. package com.key.d13_packeg_01.duotaidemo.ceshianli;
  2. public class test {
  3. public static void main(String[] args) {
  4. //创建电脑对象
  5. Computer computer = new Computer("Mac Book Pro");
  6. USB mouse = new Mouse("雷蛇");
  7. USB keyboard = new Keyboard("樱桃");
  8. System.out.println("======" + computer.getName() + "======");
  9. computer.installUSB(mouse);
  10. System.out.println("==========");
  11. computer.installUSB(keyboard);
  12. System.out.println("==========");
  13. }
  14. }

image.png