No_16_0229 Java基础学习第九天
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了No_16_0229 Java基础学习第九天相关的知识,希望对你有一定的参考价值。
文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.02.29 | lutianfei | none |
final 关键字
多态
多态概述
多态的分类:
多态中的成员访问特点:
多态中的转型问题
抽象类
抽象类概述
抽象类特点
抽象类的成员特点
抽象类的几个小问题
接口
接口概述
接口特点
接口成员特点
类与类,类与接口以及接口与接口的关系
抽象类和接口的区别
多态
多态概述
多态的分类:
多态中的成员访问特点:
多态中的转型问题
抽象类
抽象类概述
抽象类特点
抽象类的成员特点
抽象类的几个小问题
接口
接口概述
接口特点
接口成员特点
类与类,类与接口以及接口与接口的关系
抽象类和接口的区别
final 关键字
final关键字是最终的意思,可以修饰
类
,成员变量
,成员方法
。特点:
- 修饰的
类
,类不能被继承 - 修饰的
变量
,变量就变成了常量,只能被赋值一次 - 修饰的
方法
,方法不能被重写
- 修饰的
final关键字面试题
Eg1: final修饰局部变量
- 在方法内部,该变量不可以被改变
- 在方法声明上,分别演示基本类型和引用类型作为参数的情况
- 基本类型,是值不能被改变
- 引用类型,是地址值不能被改变,但是该对象堆内存的值可以改变。
Eg2: final修饰变量的初始化时机
- 在对象构造完毕前即可
class Student {
int age = 10;
}
class FinalTest {
public static void main(String[] args) {
//局部变量是基本数据类型
int x = 10;
x = 100;
System.out.println(x);
final int y = 10;
//无法为最终变量y分配值
//y = 100;
System.out.println(y);
System.out.println("--------------");
//局部变量是引用数据类型
Student s = new Student();
System.out.println(s.age);
s.age = 100;
System.out.println(s.age);
System.out.println("--------------");
final Student ss = new Student();
System.out.println(ss.age);
ss.age = 100;
System.out.println(ss.age);
//重新分配内存空间
//无法为最终变量ss分配值
ss = new Student();
}
}
多态
多态概述
- 某一个事物,在不同时刻表现出来的不同状态。
- 举例:
- 猫可以是猫的类型。猫 m = new 猫();
- 同时猫也是动物的一种,也可以把猫称为动物。
- 动物 d = new 猫();
- 再举一个例子:水在不同时刻的状态
- 举例:
- 多态前提和体现
- 有继承关系
- 有方法重写
- 有父类引用指向子类对象
- Fu f = new Zi();
多态的分类:
- 具体类多态:
- class Fu{}
- class Zi extends Fu{}
- Fu f = new Zi();
- 抽象类多态:
- abstract class Fu{}
- class Zi extends Fu{}
- Fu f = new Zi();
- 接口多态:
- interface Fu{}
- class Zi implements Fu{}
- Fu f = new Zi();
多态中的成员访问特点:
- A:
成员变量
- 编译看左边,运行看左边。
- B:
构造方法
- 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
- C:
成员方法
- 编译看左边,运行看右边。由于成员方法存在方法重写,所以它运行看右边。
- D:
静态方法
- 编译看左边,运行看左边。
- (静态和类相关,算不上重写,所以,访问还是左边的)
/*
多态:同一个对象(事物),在不同时刻体现出来的不同状态。
举例:
猫是猫,猫是动物。
水(液体,固体,气态)。
多态的前提:
A:要有继承关系。
B:要有方法重写。
其实没有也是可以的,但是如果没有这个就没有意义。
动物 d = new 猫();
d.show();
动物 d = new 狗();
d.show();
C:要有父类引用指向子类对象。
父 f = new 子();
用代码体现一下多态。
多态中的成员访问特点:
A:成员变量
编译看左边,运行看左边。
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法
编译看左边,运行看右边。
D:静态方法
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)
由于成员方法存在方法重写,所以它运行看右边。
*/
class Fu {
public int num = 100;
public void show() {
System.out.println("show Fu");
}
public static void function() {
System.out.println("function Fu");
}
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 200;
public void show() {
System.out.println("show Zi");
}
public void method() {
System.out.println("method zi");
}
public static void function() {
System.out.println("function Zi");
}
}
class DuoTaiDemo {
public static void main(String[] args) {
//要有父类引用指向子类对象。
//父 f = new 子();
Fu f = new Zi();
System.out.println(f.num);
//找不到符号
//System.out.println(f.num2);
f.show();
//找不到符号
//f.method();
f.function();
}
}
/*
* 运行结果:
100
show Zi
function Fu
*/
- 多态的好处
- 提高了程序的维护性(由继承保证)
- 提高了程序的扩展性(由多态保证)
多态的弊端
- 父类不能访问子类特有功能
如何才能访问子类的特有功能呢?
- 创建子类对象,调用方法即可。(然而很多时候不合理,且太占内存)
向下转型
:把父类的引用强制转换为子类的引用。- Zi z = (Zi)f; //要求该f必须是能够转换为Zi的
- 现象: 子可以当做父使用,父不能当作子使用。
多态中的转型问题
- 向上转型
- 从子到父
- 父类引用指向子类对象
向下转型
- 从父到子
- 父类引用转为子类对象
孔子装爹案例
//多态的问题理解:
class 孔子爹 {
public int age = 40;
public void teach() {
System.out.println("讲解JavaSE");
}
}
class 孔子 extends 孔子爹 {
public int age = 20;
public void teach() {
System.out.println("讲解论语");
}
public void playGame() {
System.out.println("英雄联盟");
}
}
//Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
//但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
//然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
//向上转型
孔子爹 k爹 = new 孔子();
//到人家那里去了
System.out.println(k爹.age); //40
k爹.teach(); //讲解论语
//k爹.playGame(); //这是儿子才能做的,一做就报错!
//讲完了,下班回家了
//脱下爹的装备,换上自己的装备
//向下转型
孔子 k = (孔子) k爹;
System.out.println(k.age); //20
k.teach(); //讲解论语
k.playGame(); //英雄联盟
- 多态中的对象变化内存图
- 多态练习:猫狗案例
class Animal {
public void eat(){
System.out.println("吃饭");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("狗吃肉");
}
public void lookDoor() {
System.out.println("狗看门");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫捉迷藏");
}
}
class DuoTaiTest {
public static void main(String[] args) {
//定义为狗
Animal a = new Dog();
a.eat();
System.out.println("--------------");
//还原成狗
Dog d = (Dog)a;
d.eat();
d.lookDoor();
System.out.println("--------------");
//变成猫
a = new Cat();
a.eat();
System.out.println("--------------");
//还原成猫
Cat c = (Cat)a;
c.eat();
c.playGame();
System.out.println("--------------");
//演示错误的内容
//Dog dd = new Animal();
//Dog ddd = new Cat();
//ClassCastException
//Dog dd = (Dog)a;
}
}
- 不同地方饮食文化不同的案例
class Person {
public void eat() {
System.out.println("吃饭");
}
}
class SouthPerson extends Person {
public void eat() {
System.out.println("炒菜,吃米饭");
}
public void jingShang() {
System.out.println("经商");
}
}
class NorthPerson extends Person {
public void eat() {
System.out.println("炖菜,吃馒头");
}
public void yanJiu() {
System.out.println("研究");
}
}
class DuoTaiTest2 {
public static void main(String[] args) {
//测试
//南方人
Person p = new SouthPerson();
p.eat();
System.out.println("-------------");
SouthPerson sp = (SouthPerson)p;
sp.eat();
sp.jingShang();
System.out.println("-------------");
//北方人
p = new NorthPerson();
p.eat();
System.out.println("-------------");
NorthPerson np = (NorthPerson)p;
np.eat();
np.yanJiu();
}
}
- 多态中继承练习
- 继承的时候:
- 子类中有和父类中一样的方法,叫重写。
- 子类中没有父亲中出现过的方法,方法就被继承过来了。
/*
多态的成员访问特点:
方法:编译看左边,运行看右边。
继承的时候:
子类中有和父类中一样的方法,叫重写。
子类中没有父亲中出现过的方法,方法就被继承过来了。
*/
class A {
public void show() {
show2();
}
public void show2() {
System.out.println("我");
}
}
class B extends A {
/*
public void show() {
show2();
}
*/
public void show2() {
System.out.println("爱");
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println("你");
}
}
public class DuoTaiTest4 {
public static void main(String[] args) {
A a = new B();
a.show();
B b = new C();
b.show();
}
}
抽象类
抽象类概述
- 动物本身并不是一个具体的事物,而是一个抽象的事物。只有真正的猫,狗才是具体的动物。同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。在Java中,一个没有
方法体
(连大括号也没有)的方法应该定义为抽象方法
,而类中如果有抽象方法,该类必须定义为抽象类
。
抽象类特点
抽象类
和抽象方法
必须用abstract
关键字修饰- 格式
- abstract class 类名 {}
- public abstract void eat();
- 格式
抽象类
不一定有抽象方法
,有抽象方法
的类一定是抽象类
- 抽象类不能实例化(抽象类如何实例化呢?)
- 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
- 抽象类有
构造方法
,其作用是为了用于子类访问父类数据的初始化。
- 抽象类的子类
- 要么是抽象类
- 要么重写抽象类中的所有
抽象方法
//abstract class Animal //抽象类的声明格式
abstract class Animal {
//抽象方法
//public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体
public abstract void eat();
public Animal(){}
}
//子类是抽象类
abstract class Dog extends Animal {}
//子类是具体类,重写抽象方法
class Cat extends Animal {
public
以上是关于No_16_0229 Java基础学习第九天的主要内容,如果未能解决你的问题,请参考以下文章