当前位置: 首页 > news >正文

JavaSE (Java基础):面向对象(下)

8.7 多态

        什么是多态? 即同一方法可以根据发送对象的不同而采用多种不同的方式。

        一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。在句话我是这样理解的:

        在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的,但是父类引用指向对象子类的话,如果子类有重写的方法(即方法名与父类相同的方法但是内容不一定相同),那么执行的子类所重写的方法,如果没有重写的方法,就执行父类的。在这句话中所说的“但可以指向对象的引用的类型有很多”,意思是一个父类可以有很多的子类,都可以使用他们的重写方法。

示例:

父类Person:

package com.oop.demo06;public class Person {public void run(){System.out.println("run");}}

子类Student:

package com.oop.demo06;public class Student extends Person {@Overridepublic void run() {System.out.println("son");}public void eat(){System.out.println("eat");}
}

 测试类:

import com.oop.demo06.Student;
import com.oop.demo06.Person;public class AppLication{public static void main(String[] args) {// 一个对象的实际类型是确定的// 可以指向的引用类型就不确定了:父类的引用指向子类// Student 能调用的方法都是自己的或者继承父类的!Student S1 = new Student();// Person是父类型的类,可以指向子类,但是不能调用子类独有的方法Person S2 = new Student();Object S3 = new Student();S2.run(); // 子类重写了父类的方法,执行子类的方法S1.run();// 对象能执行能执行哪些方法,主要看对象的左边类型,和右边关系不大!((Student) S2).eat(); //将S2的类型强制转换为Student,就可以调用方法了!S1.eat();}
}/*多态注意事项:1. 多态是方法的多态,属性没有多态2. 父类和子类要有联系    类型转换异常!     ClassCastException!3. 存在条件:    继承关系,方法需要重写,父类引用指向子类对象!1. static 方法,属于类,它不属于实例2. final 常量;3. private 方法*/


8.8 instanceof 和 类型转换

        instanceof 使用的方法格式:

        【实例的名称        instanceof        类的类型名称】,判断一个对象是什么类型,就是判读两个类型的对象是否有父子关系,有的话就返回Ture,没有就是返回False。

        使用 【实例的名称        instanceof        类的类型名称】时,能否编译看的是实例化对象的类型名,输出的结果看的是实例化对象时最右边的所实例的对象值。

首先父类是Person,其余的类:Student、Teacher是Person的子类。

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;public class AppLication{public static void main(String[] args) {// Object > Person > Student// Object > Person > Tercher// Object > StringObject object = new Student();System.out.println(object instanceof Student);  // trueSystem.out.println(object instanceof Person);   // trueSystem.out.println(object instanceof Object);   // trueSystem.out.println(object instanceof Teacher);  // falseSystem.out.println(object instanceof String);   // falseSystem.out.println("=====================================");Person person = new Student();System.out.println(person instanceof Student);  // trueSystem.out.println(person instanceof Person);   // trueSystem.out.println(person instanceof Object);   // trueSystem.out.println(person instanceof Teacher);  // false
//        System.out.println(person instanceof String);   // 编译时就报错了System.out.println("=====================================");Student student = new Student();System.out.println(student instanceof Student);  // trueSystem.out.println(student instanceof Person);   // trueSystem.out.println(student instanceof Object);   // true
//        System.out.println(student instanceof Teacher);  // 编译时就报错
//        System.out.println(student instanceof String);   // 编译时就报错}
}

类型转换(关于对象的类型):

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;public class AppLication{public static void main(String[] args) {// 类型之间的转化: 父   子// 高              低Person student = new Student();// student 将这个对象转换为Student的对象类型// 我们就可以使用这个对象类型中的方法了((Student) student).go(); // 这个是高转低需要强制转换// 如果是低转高,子类转换为父类不需要强制转换,可能会丢失一些方法!Student student1 = new Student();Person person = student1;}
}

 

8.9 static 关键字详解

        static修饰符有着静态的意思,使用他代表着这个方法或者元素在类中是与类一起加载的。

package com.oop.demo07;// static
public class Student {private static int age; // 静态变量     多线程private double score; // 非静态变量public static void main(String[] args) {Student s1 = new Student();System.out.println(s1.score);System.out.println(age);}
}

        在类中,还有着代码块这种东西,他的优先级比这个构造器还高。

package com.oop.demo07;public class Person {//    {
//        // 代码块(匿名代码块)
//    }
//
//    static {
//        // 静态代码块
//    }// 第二个执行,可以用来赋初始值{System.out.println("匿名代码块");}// 第一个执行,与类一起加载,只执行一次,不管你实例化多少个对象static {System.out.println("静态代码块");}// 第三个执行,构造器public Person(){System.out.println("构造方法");}public static void main(String[] args) {Person person = new Person();System.out.println("==============");Person person1 = new Person();}
}

        在Java中有许许多多的有用又有趣的类,在这些类中有着许多有用的静态方法,可以使用下面这个方法直接调用,想查看类的调用位置直接ctrl+左键就行。 

package com.oop.demo07;// 导入其他包中的类的静态方法
import static java.lang.Math.random; // 返回一个随机数(0,1)
import static java.lang.Math.PI;    // 圆周率
public class Test {public static void main(String[] args) {System.out.println(random());System.out.println(PI);}
}

需要注意的是:

        如果给这些东西使用了常量修饰符final,那么他将会是唯一的,无无法拥有子类。 

 


8.10 抽象类

        什么是抽象类?abstract 修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么就是抽象类。

        抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。

        抽象类,不能用new关键字来创建对象,它是用来让子类继承的。

        抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。

        子类继承了抽象类,那么他就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。

抽象父类:

package com.oop.demo08;//abstract 抽象类:类
public abstract class Action {// 约束~有人帮我们实现~// 这个就是抽象的方法,我们只定义了方法名字,他的具体功能由别人实现public abstract void doSomething();// 1.   不能new这个抽象类,只能靠子类去实现它;约束!// 2.   抽象类中可以写普通的方法// 3.   抽象方法必须在抽象类中// 抽象的抽象:约束~
}

 抽象父类的子类,他里面有重写父类的方法:

package com.oop.demo08;// 抽象类的所有方法,继承了他的子类,都必须要实现他的方法
public class A extends Action {@Overridepublic void doSomething() {}
}

 

 


8.11 接口的定义与实现

 

接口的作用:1.  约束2.  定义一些方法,让不同的人实现3.  public abstract4. public static final5. 接口不能实例化,接口中没有构造方法6. implements可以实现多个接口7. 必须要重写接口中的方法

接口UserService:

package com.oop.demo09;//interface 定义接口的修饰符(关键字),接口都需要有实现类
public interface UserService {// 接口中定义就是常量    public static finalint AGE = 9999;// 接口中的所有定义的方法其实都是抽象的   public abstractvoid add(String name);void delete(String name);void update(String name);void query(String name);
}

 接口TimeService:

package com.oop.demo09;public interface TimeService {void timer();
}

        每个接口都需要有实现类。我是这样理解的,每个接口就是定义一堆方法的名字与类型就是没有里面的内容,而他们需要有实现类来实现里面的内容,需要用到关键字implements:

package com.oop.demo09;// 类 可以实现接口 implements 接口
// 实现了接口的类,就需要重新接口中的方法// 利用接口实现多继承
public class UersServiceImpl implements UserService,TimeService{@Overridepublic void add(String name) {}@Overridepublic void delete(String name) {}@Overridepublic void update(String name) {}@Overridepublic void query(String name) {}@Overridepublic void timer() {}
}

 

 


8.12 N种内部类

package com.oop.demo10;public class Outer {private int id = 14203;public void out(){System.out.println("这是外部类的方法");}public class Inner{public void in(){System.out.println("这是内部类的方法");}// 内部类能够获得外部类的私有属性public void getID(){System.out.println(id);}}
}
import com.oop.demo10.Outer;import java.util.Optional;public class AppLication{public static void main(String[] args) {Outer outer = new Outer();// 通过这个外部类来实例化内部类Outer.Inner inner = outer.new Inner();inner.in();inner.getID();}
}

 局部内部类:

package com.oop.demo10;public class Outer {// 局部内部类,在方法里的属性也叫做局部变量public void method(){class Inner{}}
}

匿名内部类:

package com.oop.demo10;public class Test {public static void main(String[] args) {// 没有名字初始化类,匿名类// 不用将实例保存在对象中new Apple();new Apple().eat();// 甚至可以匿名一个接口new Userservice(){@Overridepublic void happle() {}};}
}class Apple{public void eat(){System.out.println("eat");}
}interface Userservice{void happle();
}

相关文章:

  • 【计算机毕业设计】026基于微信小程序的原创音乐
  • 01 企业网站架构部署于优化之Web基础与HTTP协议
  • Kafka系列之Kafka知识超强总结
  • 【高级篇】第8章 Elasticsearch 安全与权限管理
  • 什么是私域流量?私域流量为什么越来越多人做?
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年8月21日真题
  • php简单的单例模式
  • Python函数缺省参数的 “ 坑 ” (与C++对比学习)
  • MYSQL函数进阶详解:案例解析(第19天)
  • uni-app组件 子组件onLoad、onReady事件无效
  • 如何 提升需求确定性
  • LabVIEW新能源汽车电池性能测试系统
  • 某DingTalk企典 - Token
  • k8s离线安装安装skywalking9.4
  • 眼动追踪技术 | 眼动的分类和模型
  • $translatePartialLoader加载失败及解决方式
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • happypack两次报错的问题
  • Java IO学习笔记一
  • Laravel 菜鸟晋级之路
  • Redux系列x:源码分析
  • 关于for循环的简单归纳
  • 京东美团研发面经
  • 排序(1):冒泡排序
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 我这样减少了26.5M Java内存!
  • elasticsearch-head插件安装
  • Nginx实现动静分离
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #if 1...#endif
  • #Linux(帮助手册)
  • (HAL库版)freeRTOS移植STMF103
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)丶RabbitMQ的六大核心
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)事件系统
  • (一)基于IDEA的JAVA基础10
  • (原)本想说脏话,奈何已放下
  • (转)setTimeout 和 setInterval 的区别
  • .FileZilla的使用和主动模式被动模式介绍
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • @property括号内属性讲解
  • [\u4e00-\u9fa5] //匹配中文字符
  • [1127]图形打印 sdutOJ
  • [ACTF2020 新生赛]Include
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [Angular] 笔记 18:Angular Router
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [C++] vector list 等容器的迭代器失效问题
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [C++]类和对象(中)