代码复用,更容易实现类的扩展;更方便建模; 一个类包含属性、方法、构造方法,继承可以继承父类的所有属性、方法(不包含构造方法),但不能访问父类的私有属性和方法; 类默认继承Object类; java类只能单继承,接口可以多继承; 子类与父类,方法名、形参列表相同; 子类返回值类型应小于等于父类;(void) 子类的权限应大于等于父类;(public)
修饰变量,则不可以在改变; 修饰方法,则子类不能重写,只能重载(不同的方法使用相同的方法名,参数数量不同 参数类型不全同); 修饰类,该类不允许在被继承;
也可以实现代码复用,在一个类里定义个属性为另一个类;
is关系:用继承,如学生是人,学生用人里的属性 has关系:用组合,如笔记本用芯片里的属性
高内聚 低耦合 高内聚:封装细节,便于修改内部代码,提高可维护性 低耦合:简化外部调用,便于调用者使用,便于扩展和协作
default:只能邻居用,即使是儿子 不是邻居也不能用 protected:邻居能用,儿子即使不是邻居也能用,但有一点,儿子如果不是邻居(不在同一包) 则不能访问父类对象的成员方法
package com.bhzt.encapsulation; public class Person { protected int testProtected=100; } package com.bhzt.encapsulationTwo; import com.bhzt.encapsulation.Person; public class Teacher extends Person { void test1() { Person p=new Person(); //System.out.println(p.testProtected);//不同包,子类不能访问父类对象的protected 成员 } void test2() { System.out.println(super.testProtected);//不同包,子类可以用此方式访问父类对象的protected成员 } }经验总结: 属性都用private修饰,在提供相应的访问方法用public修饰;
多态,指同一个方法调用,由于对象不同可能会有不同的行为。 1.多态是方法的多态,与属性无关 2.多态存在的3个条件,继承、方法重写、父类引用指向子类对象 3.父类引用指向子类对象后,用该父类引用调用子类重写的方法
package com.bhzt.polymorphism; public class Animal { public void shout(){ System.out.println("发出声音"); } } package com.bhzt.polymorphism; public class Cat extends Animal { @Override public void shout() { System.out.println("喵喵喵"); } public void seePark(){ System.out.println("猫看院"); } } package com.bhzt.polymorphism; public class Dog extends Animal { @Override public void shout() { System.out.println("汪汪汪"); } public void seeDoor() { System.out.println("狗看门"); } } package com.bhzt.polymorphism; public class ShoutAll { // public static void startShoutDog(Dog animal) // { // animal.shout();//如果不用多态,则每增加一个动物,都需要重载一次 // } // public static void startShoutCat(Cat animal) // { // animal.shout();//如果不用多态,则每增加一个动物,都需要重载一次 // } public static void startShout(Animal animal) { animal.shout();//多态,如果不用多态,则每增加一个动物,都需要重载一次 } } package com.bhzt.test; import com.bhzt.polymorphism.Animal; import com.bhzt.polymorphism.Cat; import com.bhzt.polymorphism.Dog; import com.bhzt.polymorphism.ShoutAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; /** * 多态 */ class PolyTest { @Test public void shoutTest() { Animal a1=new Dog();//父类引用子类对象 ShoutAll.startShout(a1); Cat c1=new Cat(); ShoutAll.startShout(c1);//父类引用子类对象 //类型转换---------------------------- Animal a2=new Dog();//向上类型转换,自动转,Dog 转 Animal //a2.seeDoor();Dog里的自定义方法 不能直接调用 // Dog d2=(Dog) a2;//向下强制转换,Animal转Dog // d2.seeDoor(); if(a2 instanceof Dog) { Dog d2 = (Dog) a2;//向下强制转换,Animal转Dog d2.seeDoor(); } //Cat c2=(Cat)a2; //c2.seePark();//编译能通过,但执行会异常 } }