| 文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
|---|---|---|---|---|---|---|
| V1.0 | 2016.02.29 | lutianfei | none |
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();}}
成员变量
构造方法
成员方法静态方法
/*多态:同一个对象(事物),在不同时刻体现出来的不同状态。举例:猫是猫,猫是动物。水(液体,固体,气态)。多态的前提: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();}}/** 运行结果:100show Zifunction Fu*/
多态的弊端
如何才能访问子类的特有功能呢?
向下转型:把父类的引用强制转换为子类的引用。
向下转型
孔子装爹案例
//多态的问题理解: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); //40k爹.teach(); //讲解论语//k爹.playGame(); //这是儿子才能做的,一做就报错!//讲完了,下班回家了//脱下爹的装备,换上自己的装备//向下转型孔子 k = (孔子) k爹;System.out.println(k.age); //20k.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();}}
方法体(连大括号也没有)的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。抽象类和抽象方法必须用abstract关键字修饰
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类构造方法,其作用是为了用于子类访问父类数据的初始化。抽象方法
//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 void eat() {System.out.println("猫吃鱼");}}class AbstractDemo {public static void main(String[] args) {//创建对象//Animal是抽象的; 无法实例化//Animal a = new Animal();//通过多态的方式Animal a = new Cat();a.eat();}}
成员方法
抽象定义类练习:
//定义抽象的动物类abstract class Animal {//姓名private String name;//年龄private int age;public Animal() {}public Animal(String name,int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//定义一个抽象方法public abstract void eat();}//定义具体的狗类class Dog extends Animal {public Dog() {}public Dog(String name,int age) {super(name,age); //重要知识点!!!}public void eat() {System.out.println("狗吃肉");}}//定义具体的猫类class Cat extends Animal {public Cat() {}public Cat(String name,int age) {super(name,age);}public void eat() {System.out.println("猫吃鱼");}}//测试类class AbstractTest {public static void main(String[] args) {//测试狗类//具体类用法//方式1:Dog d = new Dog();d.setName("旺财");d.setAge(3);System.out.println(d.getName()+"---"+d.getAge());d.eat();//方式2:Dog d2 = new Dog("旺财",3);System.out.println(d2.getName()+"---"+d2.getAge());d2.eat();System.out.println("---------------------------");Animal a = new Dog();a.setName("旺财");a.setAge(3);System.out.println(a.getName()+"---"+a.getAge());a.eat();Animal a2 = new Dog("旺财",3);System.out.println(a2.getName()+"---"+a2.getAge());a2.eat();//练习:测试猫类}}
//定义抽象的老师类abstract class Teacher {//姓名private String name;//年龄private int age;public Teacher() {}public Teacher(String name,int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//抽象方法public abstract void teach();}//基础班老师类class BasicTeacher extends Teacher {public BasicTeacher(){}public BasicTeacher(String name,int age) {super(name,age);}public void teach() {System.out.println("基础班老师讲解JavaSE");}}//就业班老师类class WorkTeacher extends Teacher {public WorkTeacher(){}public WorkTeacher(String name,int age) {super(name,age);}public void teach() {System.out.println("就业班老师讲解JavaEE");}}class AbstractTest2 {public static void main(String[] args) {//具体的类测试,自己玩//测试(多态)//基础班老师Teacher t = new BasicTeacher();t.setName("刘意");t.setAge(30);System.out.println(t.getName()+"---"+t.getAge());t.teach();System.out.println("--------------");t = new BasicTeacher("刘意",30);System.out.println(t.getName()+"---"+t.getAge());t.teach();System.out.println("--------------");//就业班老师t = new WorkTeacher();t.setName("林青霞");t.setAge(27);System.out.println(t.getName()+"---"+t.getAge());t.teach();System.out.println("--------------");t = new WorkTeacher("林青霞",27);System.out.println(t.getName()+"---"+t.getAge());t.teach();}}
接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分猫狗把这些额外功能实现即可。interface表示
implements表示
接口的实现类(子类):
抽象类:实现接口,但意义不大具体类:重写接口中的所有抽象方法补充:多态的三种形式
成员变量
构造方法
成员方法
设计理念区别
跳高猫练习:
/*猫狗案例,加入跳高的额外功能分析:从具体到抽象猫:姓名,年龄吃饭,睡觉狗:姓名,年龄吃饭,睡觉由于有共性功能,所以,我们抽取出一个父类:动物:姓名,年龄吃饭();睡觉(){}猫:继承自动物狗:继承自动物跳高的额外功能是一个新的扩展功能,所以我们要定义一个接口接口:跳高部分猫:实现跳高部分狗:实现跳高实现;从抽象到具体使用:使用具体类*///定义跳高接口interface Jumpping {//跳高功能public abstract void jump();}//定义抽象类abstract class Animal {//姓名private String name;//年龄private int age;public Animal() {}public Animal(String name,int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//吃饭();public abstract void eat();//睡觉(){}public void sleep() {System.out.println("睡觉觉了");}}//具体猫类class Cat extends Animal {public Cat(){}public Cat(String name,int age) {super(name,age);}public void eat() {System.out.println("猫吃鱼");}}//具体狗类class Dog extends Animal {public Dog(){}public Dog(String name,int age) {super(name,age);}public void eat() {System.out.println("狗吃肉");}}//有跳高功能的猫class JumpCat extends Cat implements Jumpping {public JumpCat() {}public JumpCat(String name,int age) {super(name,age);}public void jump() {System.out.println("跳高猫");}}//有跳高功能的狗class JumpDog extends Dog implements Jumpping {public JumpDog() {}public JumpDog(String name,int age) {super(name,age);}public void jump() {System.out.println("跳高狗");}}class InterfaceTest {public static void main(String[] args) {//定义跳高猫并测试JumpCat jc = new JumpCat();jc.setName("哆啦A梦");jc.setAge(3);System.out.println(jc.getName()+"---"+jc.getAge());jc.eat();jc.sleep();jc.jump();System.out.println("-----------------");JumpCat jc2 = new JumpCat("加菲猫",2);System.out.println(jc2.getName()+"---"+jc2.getAge());jc2.eat();jc2.sleep();jc2.jump();//定义跳高狗并进行测试的事情自己完成。}}

原文:http://www.cnblogs.com/lutianfei/p/5233377.html