一般建议对成员变量使用 private(私有、隐藏)关键字修饰进( private 修饰的成员只能在当前类中访问)。
为每个成员变量提供配套 public 修饰的 getter、setter 方法暴露其取值和赋值。
Java 中提供一个关键字 extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。
Student 称为子类(派生类),People称为父类(基类 或超类)。
作用:当子类继承父类后,就可以直接使用父类公共的属性和方法了。
需求:
分析:
1、子类是否可以继承父类的构造器?
2、子类是否可以继承父类的私有成员?
3、子类是否可以继承父类的静态成员?
4、Java 只支持单继承,不支持多继承
为什么不支持多继承?
5、Java 支持多层继承
6、Object特点:
可以通过,super关键字,指定访问父类的成员
在子类方法中访问成员(成员变量、成员方法)满足:
如果子父类中出现了重名的成员,此时如果一定要在子类中使用父类的怎么办?
//调用
/*** 目标:学习子类构造器如何去访问父类有参构造器,还要清楚其作用。*/
public class Test {public static void main(String[] args) {Teacher teacher = new Teacher("张三", 18);System.out.Name());System.out.Age());}
}
/**
* 父类
*/
public class People {private String name;private int age;public People(){}public People(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 class Teacher extends People{public Teacher(){ }public Teacher(String name,int age){//调用父类的有参构造器,初始化继承自父类数据super(name,age);}
this:代表本类对象的应用;super:代表父类存储空间的标识。
实际上,在以上的总结中,唯独只有 this 调用本类其他构造器我们是没有接触过的。
在学员信息登记系统中,后台创建对象封装数据的时候如果用户没有输入学习,则默认使用"黑马培训中心"。
如果用户输入了学校则使用用户输入的学校信息。
/*** 目标:理解 this(…) 和 super(…) 的作用:本类构造器中访问本类兄弟构造器。*/
public class Test {public static void main(String[] args) {Student sl = new Student("易苏苏","冰火岛自学");System.out.Name());System.out.SchoolName());Student s2= new Student("张三丰");System.out.Name());System.out.SchoolName());}
}
public class Student {private String name;private String schoolName;public Student() {}/*** 如果学生不填写学校,默认这对象的学校是黑马* @param name*/public Student(String name){// 借用本类兄弟构造器this(name,"黑马培训机构");}public Student(String name, String schoolName) {this.name = name;this.schoolName = schoolName;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;}
}
方法调用:编译看左边,运行看右边。
变量调用:编译看左边,运行也看左边。(多态侧重行为为多态)
public abstract class Animal {public String name = "父类动物";public abstract void run();
}public class Dog extends Animal{public String name = "子类狗";@Overridepublic void run() {System.out.println("狗跑的的贼快!");}
}public class Tortoise extends Animal{public String name = "子类乌龟";@Overridepublic void run() {System.out.println("乌龟根本跑不了!");}
}
/*** 目标:认识多态,理解多态的形式和概念*/
public class Test {public static void main(String[] args) {Animal a = new Dog();a.run();//方法:编译看左边,运行看右边System.out.println(a.name);//对于变量的调用:编译看左,运行也看左Animal t = new Tortoise();t.run();//方法:编译看左边,运行看右边System.out.println(t.name);//对于变量的调用:编译看左,运行也看左}
}
在多态形势下,右边对象可以实现解耦合,便于扩展和维护。
定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。
/*** 父类*/
public class Animal {public String name = "动物名称";public void run(){System.out.println("动物可以跑~");}
}public class Dog extends Animal{public String name = "狗名称";@Overridepublic void run(){System.out.println("狗跑的贼溜~");}/*** 独有功能*/public void lookDoor(){System.out.println("狗在看门~");}
}public class Tortoise extends Animal{public String name = "乌龟名称";@Overridepublic void run(){System.out.println("乌龟跑的非常慢~");}
}
/*** 目标:多态的优势*/
public class Test {public static void main(String[] args) {Animal t = new Tortoise();go(t);Animal d = new Dog();go(d);
// d.lookDoor();// 多态下不能访问子类独有功能}public static void go(Animal a){System.out.println("开始~~~~");a.run();System.out.println("结束~~~~");}
}
自动类型转化(从子到父):子类对象赋值给父类类型的变量指向。
强制类型转换吗(从父到子):
此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量
作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException
Java 建议强转转换前使用 instanceof 判断当前对象的真实类型,再进行强制转换
public class Animal {public void run(){System.out.println("动物可以跑~");}
}public class Dog extends Animal{public void run(){System.out.println("狗跑的贼溜~");}public void lookDoor(){System.out.println("狗在看门~");}
}public class Tortoise extends Animal{public void run(){System.out.println("乌龟跑的很慢~");}public void layEggs(){System.out.println("乌龟可以下蛋~");}
}
/*** 目标:学习多态形势下的类中转换机制。*/
public class Test {public static void main(String[] args) {//自动类型转换:Animal dog = new Dog();dog.run();//强制类型转换Animal tortoise = new Tortoise();tortoise.run();// Dog d = (Dog) tortoise;//强制类型转换,编译阶段不报错的(注意:有继承或者实现关系编译阶段可以强制,没有毛病),运行时可能出错的!if (tortoise instanceof Tortoise){Tortoise t = (Tortoise) tortoise;//从父类类型到子类类型,必须强制类型转换t.layEggs();}else if (tortoise instanceof Dog){Dog d = new Dog();d.lookDoor();}System.out.println("----------------------");go(new Dog());go(new Tortoise());}public static void go(Animal a){a.run();if (a instanceof Tortoise){Tortoise t = (Tortoise) a;//从父类类型到子类类型,必须强制类型转换t.layEggs();}else if (a instanceof Dog){Dog d = new Dog();d.lookDoor();}}
}
需求:
分析:
/*** USB接口 == 规范*/
public interface USB {//接入 拔出void connect();void unconnet();
}public class KeyBoard implements USB{private String name;public KeyBoard(String name) {this.name = name;}@Overridepublic void connect() {System.out.println(name + "成功连接了电脑~");}/*** 独有功能*/public void keyDown(){System.out.println(name + "敲击了:来了,老弟,666……没毛病~");}@Overridepublic void unconnet() {System.out.println(name + "成功从电脑中拔出了~");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class Computer {private String name;public Computer(String name) {this.name = name;}public void start(){System.out.println(name + "开机了~");}/*** 提供安装 USB 设备的入口*/public void installUSB(USB usb){// 多态: usb == 可能是鼠标 也可能是键盘t();//独有功能 : 先判断再强转if (usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard) usb;keyBoard.keyDown();}else if (usb instanceof Monse){Monse monse = (Monse) usb;monse.dbClick();}usb.unconnet();}public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class Monse implements USB{private String name;public Monse(String name) {this.name = name;}@Overridepublic void connect() {System.out.println(name + "成功连接了电脑~");}/*** 独有功能*/public void dbClick(){System.out.println(name + "双击点亮小红心,一键三连~");}@Overridepublic void unconnet() {System.out.println(name + "成功从电脑中拔出了~");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class Computer {private String name;public Computer(String name) {this.name = name;}public void start(){System.out.println(name + "开机了~");}/*** 提供安装 USB 设备的入口*/public void installUSB(USB usb){// 多态: usb == 可能是鼠标 也可能是键盘t();//独有功能 : 先判断再强转if (usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard) usb;keyBoard.keyDown();}else if (usb instanceof Monse){Monse monse = (Monse) usb;monse.dbClick();}usb.unconnet();}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
/*** 目标: USB设备模拟* 1、定义 USB 接口:接入 拔出* 2、定义2个USB的实现类:鼠标、键盘* 3、创建一个电脑对象,创建USB设备对象,安装启动*/
public class Test {public static void main(String[] args) {// a、创建电脑对象Computer computer = new Computer("外星人");computer.start();// b、创建鼠标对象,键盘对象USB u = new KeyBoard("双飞燕");computer.installUSB(u);USB u1 = new Monse("罗技鼠标");computer.installUSB(u1);}
}
本文发布于:2024-01-29 06:28:23,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170648090613351.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |