DAY09- final关键字,抽象类,多态

今日内容: final关键字,抽象类,多态

案例一:创建5的学生对象,并将5个对象存储到数组中,进行遍历,显示对象的信息

//创建5的学生对象,并将5个对象存储到数组中,进行遍历,显示对象的信息
class Student{
	private String name;		
	private int age;

	public Student(String name,int age){	//parametric constructor, initialization
		this.name=name;						//assign				
		this.age=age;	
	}

	public void setName(String name){		//change value
		this.name=name;
	}
	public String getName(){
		return name;
	}
	public void setAge(int age){		//change value
		this.age=age;
	}
	public int getAge(){
		return age;
	}
	public String getInfo(){			//注意这里是String不要顺手写成void,写错好几遍了
		return name+"..."+age+"...";
	}
}

public class Demo1 {
	public static void main(String[] args){
		Student[] stu=new Student[5];		//creat an array with 5 elements
		stu[0]=new Student("张一",20);		//creat a real object
		stu[1]=new Student("张二",21);		//注意,此处是,而不是+,小心写错
		stu[2]=new Student("张三",22);
		stu[3]=new Student("张四",23);
		stu[4]=new Student("张五",24);
		for(int i=0;i<stu.length;i++){
			System.out.println(stu[i].getInfo());		
			stu[i].setName("李一");			//assign
			System.out.println("---"+stu[i].getName()+"---");
		}
	}
}

final关键字

final是修饰符,用来修饰类,方法和变量
被final修饰后意味着这个变量或者类,方法等不能再被更改了。
public static final 数据类型 大写字母=数据;例如
public static final double My_PI=3.14;

class  Demo2 extends A{
	public void main(String[] args){		//此处没有static,因为静态方法只能引用静态变量,如果此处加了static那么在这里就会报错了
		num=20;								//尝试给被final修饰的变量改值,这是不允许的
	}
}
class A{
	final int num=10;			//被final修饰了,不能再做更改
}

加了static之后报错如下:
加入static之后报错如下加入static置换

抽象类

父类中描述不清子类的功能的具体实现,只能表示有这个功能,具体实现要交给子类去重写,像这样的情况,我们需要用到 抽象(abstract)
具体方法:
1.描述不清的功能,不要写方法体(指的是连方法后面的大括号都不要写,写一个分号替代大括号)
2.同事在函数的返回值类型前面加上关键字:abstract
格式:abstract class 类名 ();
特点:
1.抽象类不能实例化,因为调用了抽象方法没有意义,他都没有方法体没办法执行
2.必须有子类,子类需要将继承的抽象方法全部覆盖,否则子类依然还是一个抽象类
3.抽象方法一定在抽象类中,即一个方法被abstract修饰了那么这个类的也要被abstract修饰才行。
抽象类的细节问题:
1.抽象类一定是父类吗?
一定是,因为抽象类就是通过不同的子类向上抽取共性信息得到的;抽象类必须由子类去继承和重写抽象函数。
2.抽象类中有构造方法吗?
必须有,因为抽象类需要由子类去继承,子类实例化的时候,要调用父类的构造函数
3.抽象类中可以不书写抽象方法吗?
可以;抽象类中可以只有非抽象的成员;同样,这个抽象类也不能实例化。
4.抽象类中可以定义非抽象的方法吗?
可以。抽象类中可以书写普通的方法和成员变量
5.抽象关键字abstract不能和哪些修饰符关键字共存?
因为抽象的函数只有被继承的子类重写了,才可以使用,所以不能和private以及final关键字一起使用;static:static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义。
6.抽象类什么时候使用?
当描述的功能不确定,不知道具体怎么实现的时候,就需要使用抽象函数,这个类也是抽象的;不想实例化这个类,但是允许别人继承,也可以使用抽象类。

多态

在java中,多态指的是父类型引用指向子类实例对象;(接口类型引用指向实现类对象)例如:
Dog dog=newDog(); //使用事物本身的类型描述事物
Animal an=new Dog();//使用父类类型描述事物,new Dog()是一个堆内存中的对象,Animal类型的引用an在栈中指向了他
多态的前提是必须有继承关系或接口实现关系
注意:使用父类型引用指向子类对象,不能通过父类型引用访问子类特有的属性和方法。例如:Animal a=new Dog();假设一个wangwang()的方法是子类特有的,则a.wangwang();就会报错,因为定义的是父类型的引用,他只会去 父类型中找方法。
多态形式创建的对象,访问成员的变化:
变量: 编译和运行都看父类
方法: 编译看父类,运行看子类
静态方法: 编译运行都看父类
多态类型的转换:
自动向上转型:将子类型对象给父类型引用,可以自动进行;提升了子类对象的类型
Animal dog=new Dog();
强制向下转型:将父类型引用转为子类型引用,降低了引用的类型,需要强制转换
Dog dog=(Dog)animal;强制类型转换容易报错:ClassCastException,取决于animal到底是什么类型的对象,如果是Dog类型就不会报错,如果是Animal类型就会报错。如:
Animal a= new Animal();
Cat c=(Cat)a;
这个时候就会报错,但是编译是通过的,只是运行时会报错。Animal类型引用指向Animal类型对象,强转为Cat类型,父类强转为子类型的就会报错。

instanceof 关键字

instanceof是一个比较运算符,输出的结果是一个boolean类型的结果。运算符左边是一个指向一个对象的引用(左边就是一个变量名),右边是一个类名,运算符表示的意思就是:判断左边的对象类型是不是右边的类;使用instatnceof关键字,可以实时判断一个对象的类型,就可以避免强制类型转换中容易出现的类型转换异常问题。
静态成员不参与多态,只要费静态成员参与多态,因为多态是和对象有关的。但是静态函数是可以参与多态的。静态函数和静态成员的区别?

猜你喜欢

转载自blog.csdn.net/qq_42837554/article/details/88044458