一般建议对成员变量使用 private(私有、隐藏)关键字修饰进( private 修饰的成员只能在当前类中访问)。
为每个成员变量提供配套 public 修饰的 getter、setter 方法暴露其取值和赋值。
Java 中提供一个关键字 extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。
Student 称为子类(派生类),People称为父类(基类 或超类)。
作用:当子类继承父类后,就可以直接使用父类公共的属性和方法了。
需求:
分析:
1、子类是否可以继承父类的构造器?
2、子类是否可以继承父类的私有成员?
3、子类是否可以继承父类的静态成员?
4、Java 只支持单继承,不支持多继承
5、Java 支持多层继承
6、Object特点:
//调用
/**
* 目标:学习子类构造器如何去访问父类有参构造器,还要清楚其作用。
*/
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher("张三", 18);
System.out.println(teacher.getName());
System.out.println(teacher.getAge());
}
}
/**
* 父类
*/
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(…) 的作用:本类构造器中访问本类兄弟构造器。
*/
public class Test {
public static void main(String[] args) {
Student sl = new Student("易苏苏","冰火岛自学");
System.out.println(sl.getName());
System.out.println(sl.getSchoolName());
Student s2= new Student("张三丰");
System.out.println(s2.getName());
System.out.println(s2.getSchoolName());
}
}
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 = "子类狗";
@Override
public void run() {
System.out.println("狗跑的的贼快!");
}
}
public class Tortoise extends Animal{
public String name = "子类乌龟";
@Override
public 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 = "狗名称";
@Override
public void run(){
System.out.println("狗跑的贼溜~");
}
/**
* 独有功能
*/
public void lookDoor(){
System.out.println("狗在看门~");
}
}
public class Tortoise extends Animal{
public String name = "乌龟名称";
@Override
public 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;
}
@Override
public void connect() {
System.out.println(name + "成功连接了电脑~");
}
/**
* 独有功能
*/
public void keyDown(){
System.out.println(name + "敲击了:来了,老弟,666……没毛病~");
}
@Override
public 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 == 可能是鼠标 也可能是键盘
usb.connect();
//独有功能 : 先判断再强转
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;
}
@Override
public void connect() {
System.out.println(name + "成功连接了电脑~");
}
/**
* 独有功能
*/
public void dbClick(){
System.out.println(name + "双击点亮小红心,一键三连~");
}
@Override
public 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 == 可能是鼠标 也可能是键盘
usb.connect();
//独有功能 : 先判断再强转
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);
}
}