static
static:静态,可以修饰成员方法,成员变量。(是所有成员共享的)
static修饰的特点:
- 被类的所有对象共享(判断是否使用静态关键字的条件)
- 可以通过类名和对象名调用
- 在定义对象时,用static修饰了的对象只需赋值一次,其他的对象的该成员都是第一次赋值的值
如代码示例:
代码中直接对调用类名进行赋值,该类的所有对象的university成员都为“传智大学”了,不用再一一赋值。
static的访问特点
非静态的成员方法:
- 能访问静态的成员变量
- 能访问非静态的成员变量
- 能访问静态的成员方法
- 能访问非静态的成员方法
静态的成员方法:
- 能访问静态的成员变量
- 能访问静态的成员方法
也就是说:静态成员方法只能访问静态成员
多态
概述:同一个对象,在不同时刻表现出来的不同形态
例如:猫
我们可以说猫是猫:猫cat = new 猫();我们也可以说猫是动物: 动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态
也就是说:我们看见猫的时候,我们可以说这是一个动物,也可以直接说这是一只猫。
------------------------------------------------------------------------------------------------------------------
多态的前提和体现:
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象
多态中成员访问特点
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边因为成员方法有重写,而成员变量没有,所以他们的访问不一样
多态的好处与弊端
多态的好处:
提高了程序的扩展性
具体体现:在定义方法的时候,使用父类型作为参数,在使用的时候使用的是子类型参与操作多态的弊端:
多态不能访问子类特有的功能
多态中的转型
向上转型:
从子到父
父类引用指向子类对象
向下转型:
从父到子
父类引用转为子类对象
如示例代码:
多态的代码案例示例:猫和狗
//Animal
package com;
public 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 void eat(){
System.out.println("动物吃东西");
}
}
//AnimalDemo
package com;
public class AnimalDemo {
public static void main(String[] args) {
Animal a=new Cat();
a.setName("加菲");
a.setAge(5);
System.out.println(a.getName()+","+a.getAge());
a.eat();
a=new Cat("加菲",5);
System.out.println(a.getName()+","+a.getAge());
a.eat();
Animal b=new Dog();
b.setName("旺旺");
b.setAge(6);
System.out.println(b.getName()+","+b.getAge());
b.eat();
b=new Dog("旺旺",6);
System.out.println(b.getName()+","+b.getAge());
b.eat();
}
}
//Cat
package com;
public class Cat extends Animal {
public Cat(){
}
public Cat(String name,int age){
super(name,age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
//Dog
package com;
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}