熟练掌握三大基本特征的的概念与应用
学习封装我们需要了解类和对象的概念
(1)、类
(2)、对象
(3)、封装
(4)、访问修饰符
封装其实就是要让有些类看不到另外一些类中定义的字段和方法。Java提供了不同的访问权限修饰符来限定类中的成员让谁可以访问到。
继承可以解决代码复用问题,当多个类存在相同的属性和方法时,可以从这些类中提取出共同的属性和方法给父类,然后我们的子类就可以省去这些共同的属性和方法,只需要通过extends语句来声明继承即可
例子:
老师:拥有名字、年龄、级别三个状态,有授课和休息两个功能
学生:拥有名字、年龄、学号三个状态,有学习和休息两个功能
以上老师和学生都拥有名字和你年龄2个字段,都有休息的功能,我们可以吧共同的字段提取出来给父类来定义,把休息的功能也提取出来给父类,
然后老师和学生类就不需要定义这2个字段了,也可以不定义休息的方法了,只需要用extends去继承父类即可。
(1)、继承语法
public class 子类名 extends 父类名{ }
注意:Java中类只支持单继承,但是支持多重继承。也就是说一个子类只能有一个直接的父类,父类也可以再有父类,Java中接口是支持多继承的。
(2)、 子类能继承的父类成员
子类继承父类之后,可以拥有到父类的某一些成员(字段和方法),根据访问修饰符来判断:
(3)、方法覆盖
上述的方法覆盖细节真多,记不住,那么记住下面这句话就万事OK了。
精华:直接把你要重写的方法复制粘贴到子类中,然后重新编写子类方法体就好了!
(4)、super关键字
在子类中的某一个方法中需要去调用父类中被覆盖的方法,此时得使用super关键字。
子类方法名() {
super.父类方法名;
}
所谓多态,表示一个对象具有多种形态。说的具体点就是同一引用类型变量调用同一方法时,由于引用实例不同,方法产生的结果不同。
例子:
// 现有3个类,狗和猫都继承了动物这个类
public class Animal{}
public class Dog extends Animal{} // Dog is a Animal
public class Cat extends Animal{} // Cat is a Animal
// 下面是2种实例化对象的方式
Dog d = new Dog(); //创建一只狗对象,赋给子类类型变量
Animal a = new Cat(); //创建一只猫对象,赋给父类类型变量
我们看第二种实例化方式
编译时类型:声明对象变量的类型——>Animal
运行时类型:对象的真实类型 ——>Dog
当编译类型和运行类型不一致的时候,此时多态就产生了,结合多态语法理解记忆
(1)、多态语法
父类 变量名 = new 子类();
变量名.方法();
接口 变量名 = new 实现类();
变量名.方法();
(2)、 多态例题
Animal类:
public class Animal {
public void shut() {
System.out.println("Animal...shout...");
}
}
Dog类:
public class Dog extends Animal{
public void shut() {
System.out.println("旺旺旺...");
}
}
Cat类:
public class Cat extends Animal{
public void shut() {
System.out.println("妙妙妙...");
}
}
测试类:
public class AnimalDemo {
public static void main(String[] args) {
// 创建Cat对象
Animal a = new Cat();
a.shout();
// 创建Dog对象
a = new Dog();
a.shout();
}
}
运行结果:
妙妙妙...
旺旺旺...
ISwimable 接口:
public interface ISwimable {
void swim();
}
Fish类:
public class Fish implements ISwimable{
public void swim() {
System.out.println("游啊游...");
}
}
测试类:
public class FishDemo {
public static void main(String[] args) {
// 创建Fish对象
ISwimable fish = new Fish();
fish = new Dog();
//Dog也是实现了ISwimable接口的
Fish f = new Fish();
fish.swim();
}
}
运行结果:
游啊游...
(3)、多态中方法的调用
Animal a = new Cat();
a.shout();
使用多态调用方法时,先判断shout方法是否在父类Animal类中:
1> 找不到:编译报错
找 到:再看shout方法是否在子类Cat类中:
2> 找不到:运行父类方法
找 到:运行子类方法(这个才是真正的多态方法调用)
Object obj = new 子类对象();
Animal a = new Dog();
Object obj = new Dog(); //Object是所有类的根类
子类类型 变量 = (子类类型)父类对象;
Animal a = new Dog();
Dog d = (Dog) a; //正确
Cat c = (Cat) a; //错误
注意:上面的 a 是父类引用指向子类对象, a 对象可以直接使用父类的方法和子类对父类重写的方法,但是不能直接访问子类独有的方法,要想访问需要把 a 对象转换成对应的子类类型,这也叫向上转型。
(5)、instanceOf
instanceof 运算符:判断该对象是否是某一个类/接口的实例,在开发中运用不是很多
语法格式:
boolean b = 对象A instanceof 类B; //判断 A对象是否是 B类的实例?如果是,返回true
Animal a = new Dog();
System.out.println(a instanceof Animal); //true
System.out.println(a instanceof Dog); //true
System.out.println(a instanceof Cat); //false