重写

子类通过重写父类的方法, 可以用自身的行为替换父类的行为

重写的三个要点:

  • "==" :方法名, 形参列表, 返回值类型相同
  • "<=" : 返回值类型和声明异常类型, 子类小于等于父类
  • ">=" : 访问权限, 子类大于等于父类. 重写的方法不能使用比被重写方法更严格的访问权限
public class TestOverride {
public static void main(String[] args) {
Vehicle v1 = new Vehicle();
Vehicle v2 = new Horse();
Vehicle v3 = new Plane(); v1.run();
v2.run();
v3.run(); v1.stop();
v2.stop();
v3.stop();
}
} class Vehicle {
public void run() {
System.out.println("跑.....");
}
public void stop() {
System.out.println("停止不动");
}
} class Horse extends Vehicle {
public void run() {
System.out.println("嘚嘚......");
}
} class Plane extends Vehicle {
public void run() {
System.out.println("咻......");
}
public void stop() {
System.out.println("根本停不下来");
super.stop(); // 通过super调用父类Vehicle中被覆盖的stop函数
}
} /*执行结果
跑.....
嘚嘚......
咻......
停止不动
停止不动
根本停不下来
停止不动
*/

对象的类型转型

父类引用指向子类对象, 称这个过程为向上转型, 属于自动类型转换, 向上转型后的父类引用变量只能调用它编译类型的方法, 不能调用它运行时的方法. 这时需要进行类型的强制转换, 称之为向下转型, 在向下转型过程中, 必须将引用变量转换成真实的子类类型(运行时类型), 否则会出现转换异常ClassCastException

子类转换为父类: 自动转换

  • 上转型对象不能操作子类新增的成员变量和方法
  • 上转型对象可以操作子类继承或重写的成员变量和方法
  • 如果子类重写了父类的某个方法, 上转型对象调用该方法时, 是调用的重写方法

父类转换为子类: 强制转换

public class TestPolym {
public static void main(String[] args) {
Animal animal = new Dog(); // 向上类型转换 // 属性没有多态!!!
System.out.println(animal.age); // 属性调用时, 仍然是基类属性, 属性没有多态
animal.shout(); // 调用Dog类中的shout函数 animalCry(animal); // 传的具体是哪一个类就调用哪一个类的方法, 大大提高了程序的可扩展性
// 如果没有多态, 这里需要写很多重载方法, 如果增加一种动物, 就需要重载一种动物的叫法, 非常麻烦
// 有了多态后, 只需要增加这个类继承Animal基类就可以了
animalCry(new Dog());
animalCry(new Cat()); //animal.gnawBone(); // 直接通过animal来调用Dog中定义的gnawBone报错
// 多态不能调用声明类型中没有的方法 // 编写程序时, 如果想调用运行时类的方法, 只能进行类型转换, 不然通不过编译器检查
Dog dog = (Dog) animal;
dog.gnawBone(); System.out.println(dog instanceof Animal);
System.out.println(animal instanceof Cat);
System.out.println(animal instanceof Dog); Dog d = new Dog();
animalCry(d);
} static void animalCry(Animal a)
{
a.shout();
}
} class Animal {
int age = 10; public void shout() {
System.out.println("叫了一声");
}
} class Dog extends Animal {
int age = 28; public void shout() {
System.out.println("旺旺");
} public void gnawBone() {
System.out.println("在啃骨头");
}
} class Cat extends Animal {
int age = 18; public void shout() {
System.out.println("喵喵");
}
}
/*
10
旺旺
旺旺
旺旺
喵喵
在啃骨头
true
false
true
旺旺
*/

抽象类和抽象方法

抽象类是一种模板, 为所有子类提供一个通用模板, 子类可以在这个模板基础上进行扩展

通过抽象类可以避免子类设计的随意性, 这样就可以做到严格限制子类的设计, 使子类之间更加通用

抽象方法, 使用abstract修饰的方法, 没有方法体, 只有生命. 定义的是一种规范, 子类必须给抽象方法提供具体的实现

要点:

抽象方法和抽象类都必须使用abstract来修饰

抽象方法没有方法体, 只需要声明不需要实现

含有抽象方法的类只能or必须定义抽象类

相反, 抽象类里的方法不一定全是抽象方法, 也可以没有抽象方法

抽象类可以包含属性, 方法, 静态初始化块, 构造方法

抽象类不能实例化, 及不能用new来实例化抽象类, 只能用来被子类调用

抽象类只能用来继承

抽象方法必须被子类实现, 抽象类的子类必须覆盖所有的抽象方法才能被实例化, 否则还是抽象类

public class Test {
public static void main(String[] args) {
Animal test_1 = new Dog(); // 抽象类能够实现多态
test_1.shout();
//test_1.haha(); // 多态不能调用声明类型用没有的方法 Dog test_2 = new Dog();
test_2.haha();
}
} abstract class Animal {
static {
System.out.println("Static method in abstract class");
}
abstract void shout(); // 抽象类方法没有方法体
} class Dog extends Animal {
static {
System.out.println("Static method in class Dog");
} void shout() { // 必须重写父类的抽象方法, 否则编译不通过
System.out.println("旺旺!!!");
} void haha()
{
System.out.println("这句是来搞笑的");
}
}
/*
Static method in abstract class
Static method in class Dog
旺旺!!!
这句是来搞笑的
*/

接口

接口与类的区别:

接口是比"抽象类"还抽象的"抽象类", 可以更加规范的对子类进行约束. 全面的专业的实现: 规范和具体实现的分离

接口就是规范, 定义的是一组规则, 体现了现实世界中"如果能..., 则必须..."的意思

接口的本质是契约, 定制好后大家都需遵守

项目的具体需求是多变的, 必须以不变应万变才能从容开发, 此处的"不变"就是"规范"

接口相关规则:

接口中所有方法都是抽象的

即使没有显式的将接口中的成员用public标示, 也是public访问类型

接口中变量默认用public static final标示, 所有接口中定义的变量就是全局静态常量

接口中方法默认用public abstract表示

可以定义一个新接口, 用extends区继承一个已有的接口

可以定义一个类, 用implements去实现一个接口中所有方法

可以定义一个抽象类, 用implements去实现一个接口中部分方法

从接口的实现者角度来开: 接口定义了可以向外提供的服务

从接口的调用者角度来看: 接口定义了实现者能提供的服务

格式:

[访问修饰符] interface 接口名 [extends 父接口1, 父接口2, ...] {

常量定义 // 总是: public static final

方法定义 // 总是: public abstract

}

接口的实现

子类通过implements来实现接口中的规范

接口不能创建实例, 但是可以用于声明引用变量类型

一个类实现了接口, 必须事项接口中所有的方法, 并且这些方法只能是public

Java的类只支持单继承, 接口支持多继承

JDK1.7之前, 接口中只能包含静态常量, 抽象方法, 不能有普通属性, 构造方法, 静态初始化块, 普通方法

JDK1.8之后, 接口中包含普通静态方法-------------------->

待解决

  1. 普通类: 具体实现
  2. 抽象类: 具体实现, 规范
  3. 接口: 规范
/*******MyInterface.java*********/

public interface MyInterface {
/* public static final */ int MAX_AGE = 10; /* public abstract */ void test_1();
} class MyClass implements MyInterface { @Override
public void test_1() {
System.out.println(MAX_AGE);
System.out.println("Myclass.test_1()");
}
} interface A {
int a = 13;
void test_in_A();
} interface B {
void test_in_B();
} // 接口多继承 C继承了A中的a
interface C extends A, B{
void test_in_C(); static void hahaha() {
System.out.println("静态方法");
} // 普通静态方法
} // 接口实现
class Test implements C {
public void test_in_A() {
System.out.println("A");
System.out.println(A.a);
}
public void test_in_B() {
System.out.println("B");
}
public void test_in_C() {
System.out.println("C");
System.out.println(C.a);
C.hahaha();
}
} /**********testInterface.java****************/
public class testInterface { public static void main(String[] args) {
MyClass myclass = new MyClass();
myclass.test_1();
// 不能通过继承直接使用C中的静态方法
//myclass.hahaha(); System.out.println("###########分隔符############"); Test myclass_2 = new Test();
myclass_2.test_in_A();
myclass_2.test_in_B();
myclass_2.test_in_C(); System.out.println("###########分隔符############"); // 接口实现多态!!!
A myclass_3 = new Test();
myclass_3.test_in_A();
// 属性没有多态, Test类继承接口A中的a
System.out.println(myclass_3.a); }
} /* 执行结果
10
Myclass.test_1()
###########分隔符############
A
13
B
C
13
静态方法
###########分隔符############
A
13
13
*/

Java_三大特征相关的更多相关文章

  1. Java_面向对象三大特征

    面向对象特征 面向对象三大特征: 继承, 封装, 多态 继承 继承: 子类可以从父类继承属性和方法 对外公开某些属性和方法 要点(eclipse中Ctrl+T查看继承结构) 1.父类也称超类, 基类, ...

  2. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

  3. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

  4. Java面向对象的三大特征

    Java面向对象的三大特征 java面向对象的三大特征:“封装.继承.多态”.更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. ...

  5. JS面向(基于)对象编程--三大特征

    抽象 在讲解面向对象编程的三大特征前,我们先了解什么叫抽象,在定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板).这种研究问题的方法称为抽象. 封装 什么是封装? ...

  6. JAVA:类的三大特征,抽象类,接口,final关键字<3>

    一.类的三大特征 1.封装性 (1).什么是封装 封装就是把抽象出的数据和对数据的操作封装在一起, 数据被保护在内部, 程序的其他部分只有通过被授权的操作(成员方法), 才能对数据进行操作. (2). ...

  7. Java学习第三篇:类的三大特征,抽象类,接口,final关键字

    一.类的三大特征 1.封装性 (1).什么是封装 封装就是把抽象出的数据和对数据的操作封装在一起, 数据被保护在内部, 程序的其他部分只有通过被授权的操作(成员方法), 才能对数据进行操作. (2). ...

  8. C#学习笔记7:多态是面向对象的三大特征(封装、继承、多态)之一

    多态: 多态是面向对象的三大特征(封装.继承.多态)之一. 什么是多态? 一个对象表现出多种状态. 多态的实现方法: 1.虚方法: 2.抽象方法: 3.接口. PS:New 关键词可以隐藏父类的方法. ...

  9. OC面向对象的三大特征

    OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可 ...

随机推荐

  1. 034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述

    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述 本文知识点:Java中的流程控制相关概念的认识 三大流程控制语句结构的简介 顺序 ...

  2. C++中头文件简介(stdio.h & chrono)

    参考: 1. https://baike.baidu.com/item/stdio.h 2. https://www.cnblogs.com/jwk000/p/3560086.html 1. stdi ...

  3. Sprign-mvc系列之Spring快速入门 什么是sprign-mvc spring-mvc的作用及其基本使用+组件解析+注解解析

    Spring-mvc 什么是SpringMvc SpringMvc是一种基于java的实现Mvc设计模式的请求驱动类型的轻量级web框架,属于SpringFrameWork的后续产品,已经融合在Spr ...

  4. 谈谈InnoDB中的B+树索引

    索引类似于书的目录,他是帮助我们从大量数据中快速定位某一条或者某个范围数据的一种数据结构.有序数组,搜索树都可以被用作索引.MySQL中有三大索引,分别是B+树索引.Hash索引.全文索引.B+树索引 ...

  5. linxu 命令

    top | grep java 统计 java 进程使用的资源比率 nohub java -jar test.war & 后台运行 test.war 程序,标准输出到 test.war 程序目 ...

  6. C# excel文件导入导出

    欢迎关注微信公众号 C#编程大全 这里有更多入门级实例帮你快速成长 在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获! 环境:wi ...

  7. Python+Appium自动化测试(14)-yaml配置Desired capabilities

    一,前言 在之前的appium自动化测试示例中,我们都是把构造driver实例对象的数据(即Desired Capabilities)写在业务代码里,如下: # -*- coding:utf-8 -* ...

  8. js 为什么0.1+0.2不等于0.3

    当程序员在使用浮点数进行计算逻辑处理时,不注意,就可能出现问题, 记住,永远不要直接比较俩个浮点的大小 这个属于数字运算中的精度缺失的问题 在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的 ...

  9. GDB将所有线程堆栈输出到文件

    在调试多线程程序时,经常需要查看线程堆栈信息,如果线程数目过多,每次查看一个线程堆栈,繁琐耗时.下面介绍一种一次性将所有线程堆栈输出到文件的方法. 首先,将gdb attach到调试线程 gdb -p ...

  10. java 图片相似度算法

     利用直方图原理实现图像内容相似度比较  ,作为笔记记录在随笔中.   public class PhotoDigest {     public static void main(String[]  ...