1)final关键字
*概念:最终的,无法更改的(是状态修饰符)
2)final关键字可以和static关键字一起使用
3)特点:
*可以修饰类:
**该类不能别继承
*修饰成员方法:
**该方法不能重写
*可以修饰成员变量.此时变量就是常量
**如果该变量是一个基本基本类型修饰的变量:变量的值再不能改变
**如果该变量是一个引用类型的(Student s = new Student()),被final修饰了那么该s对象不能再重新开辟堆内存空间了(堆内存地址值不能改变)
4)使用final关键字注意事项:
*final修饰的变量是基本类型,它的值不再改变
*final修饰的变量是引用类型,它的堆内存地址值不再改变
//继承代码演示:/*
狗(具体事务)
属性:名字(name),年龄(age),毛色(color)
行为:吃(eat()),睡觉(sleep())
特有行为:看门(lookDoor())
猫(具体事务)
属性:名字(name),年龄(age),毛色(color)
行为:吃(eat()),睡觉(sleep())
特有行为:抓老鼠(mouse())
动物类(Animal)(抽取而来)
定义:共同属性:名字(name),年龄(age),毛色(color)
共同行为:吃(eat),睡觉(sleep)
*/classAnimal{private String name ;privateint age ;private String color;//无参构造方法publicAnimal(){super();// TODO Auto-generated constructor stub}//有参构造方法publicAnimal(String name,int age, String color){super();this.name = name;this.age = age;this.color = color;}//对外提供公共方法set,get 方法/**
* @return the name
*/public String getName(){return name;}/**
* @param name the name to set
*/publicvoidsetName(String name){this.name = name;}/**
* @return the age
*/publicintgetAge(){return age;}/**
* @param age the age to set
*/publicvoidsetAge(int age){this.age = age;}/**
* @return the color
*/public String getColor(){return color;}/**
* @param color the color to set
*/publicvoidsetColor(String color){this.color = color;}publicvoideat(){
System.out.println(name +"要吃东西");}publicvoidsleep(){
System.out.println(name+"要睡觉");}}classCatextendsAnimal{publicCat(){super();// TODO Auto-generated constructor stub}publicCat(String name,int age, String color){super(name, age, color);// TODO Auto-generated constructor stub}publicvoideat(String food){
System.out.println(getName()+"吃"+ food);}publicvoidcatchMuose(){
System.out.println(getName()+"可以抓老鼠");}}classDogextendsAnimal{publicDog(){super();// TODO Auto-generated constructor stub}publicDog(String name,int age, String color){super(name, age, color);// TODO Auto-generated constructor stub}publicvoideat(String food){
System.out.println(getName()+"吃"+ food);}publicvoidlookDoor(){
System.out.println(getName()+"可以看门");}}publicclassAnimalText{publicstaticvoidmain(String[] args){
Cat c =newCat("Tom",3,"金色");
c.eat();
c.sleep();
c.catchMuose();
System.out.println(c.getName()+"--"+c.getAge()+"--"+c.getColor());}}
四.面向对象三大特征–>多态
1)概念:
一个事物在不同时刻的不同体现
2)多态的前提条件:
*有继承关系
*有方法重写
*父类引用指向子类对象
3)多态的优点:
*提高了代码的复用性
*提高了代码的扩展性
4)多态的特点:
*成员变量:
编译看左边.运行看左边!(等号左边编译通过,说明Fu类存在这个变量;运行看左,访问的是Fu类的变量)
*成员方法:
编译看左边,运行看右边(等号左边编译通过,说明父类存在这个方法;运行看右边,子类出行和父类一模一样的方法声明:方法重写)
*静态的成员方法(不是方法重写,和类相关):
编译看左,运行看左
*构造方法:
存在继承关系,还分层初始化;先让父类初始化,然后子类初始化
5)多态的弊端:
*不能访问子类特有功能
*解决办法:
**创建子类的具体对象来访问子类的特有的功能(耗费空间)
**向下转型
Animal a = new Dog();(这是向上转型,是向下转型的前提)
Dog d = (Dog)a;(优与第一种)
*在使用向下转型时,一定要注意类型,现在父类引用所指向的内存是谁
/* 使用多态的案例:
定义一个动物类,里面有一个方法voice(),
定义一个类Cat,实现voice方法
定义一个Dog类,实现voice方法
定义一个Store(宠物店)类的getInstance方法:
如果传入的参数是字符串dog,则返回一个Dog对象;
否则,返回一个Cat对象。(提示:字符串中比较用equals(指定字符串)方法)
*/import java.util.Scanner;//动物类classAnimal{publicvoidvoice(){
System.out.println("");}}//猫类继承与动物类classCatextendsAnimal{publicvoidvoice(){
System.out.println("猫是喵喵叫...");}}//狗类继承与动物类classDogextendsAnimal{publicvoidvoice(){
System.out.println("狗是汪汪叫...");}}//宠物店类classStore{publicvoidfuntion(Animal a){
a.voice();}public Animal getInstance(String a){if("dog".equals(a)){returnnewDog();}elseif("cat".equals(a)){returnnewCat();}else{return null;}}}//测试类publicclassText{publicstaticvoidmain(String[] args){//测试猫
Store s =newStore();
s.funtion(newCat());//使用多态//测试狗
Store s3 =newStore();
s3.funtion(newDog());//使用多态//测试输入
Scanner sc =newScanner(System.in);
System.out.println("请输入需要测试的字符串 : ");
String ss = sc.nextLine();
Store s4 =newStore();
System.out.println("输出对应对象 :");
System.out.println(s4.getInstance(ss));}}