1.面向对象编程的第三个特点 继承
继承的好处
java不能继承多个父级
代码文件结构
1.main.java
package org.example;
//package org.codewithme;//import org.example.UIControl;//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {public static void main(String[] args) {
// var control = new TextBox();
// control.
// control.disable();
// System.out.println(control.isEnabled());
// var obj = new Object();
// obj.// var box1 = new TextBox();
// var box2 =box1;
// System.out.println(box1.hashCode());
// System.out.println(box2.hashCode());//这个对象的地址的哈希值
// System.out.println(box1.equals(box2));// var box1 = new TextBox();
// var box2 =new TextBox();
// System.out.println(box1.equals(box2));
// System.out.println(box1.toString());// 2.不想重复编码 使用inheritance// 3. 访问修饰符
// public成员可以在class外被访问 而private不能
//var textBox = new TextBox();
// new UIControl(true).is
// protected 修饰的变量在这个包里是公共的// 4.方法重写 overriding 重写继承至父类的方法
// 方法重构 overloading ,同一个名字的方法 传参不一样
// var textBox = new TextBox();
// textBox.setText("hello world");
// System.out.println(textBox);//不用显示调用textBox.toString(),因为printline方法自动会调用,任何传到这个括号里的对象 的toString()方法// System.out.println(textBox.toString());// 5.upcasting和downcasting// var control = new UIControl(true);
// var textBox = new TextBox();
// show(textBox);//TextBox class中继承了uI ctrolclas// 6.比较两个对象
//var point1 = new Point(1,2);
//var point2 = new Point(1,2);
// System.out.println(point1==point2);//point1和point2都是引用类型,这俩东西储存的是point对象在内存中的地址,这是两个不同的对象 所以这两个变量中有不同的值System.out.println(point1.equals(point2));System.out.println(point1.equals(textBox));System.out.println(point1.equals(point1));
// System.out.println(point1.hashCode());
// System.out.println(point2.hashCode());//
// 7.面向编程的第四个特点 多态
//UIControl[] controls = {new TextBox(),new CheckBox()};
//for (var control : controls){//for (元素类型 变量名 : 集合或数组)
// control.render();//多态的体现 每个类都有自己各自的render方法 而不是在主方法里写 fat if else语句
//}// 8.抽象类和方法// a.
// var uiControl = new UIControl();// b.final classes 当声明一个class为此类型时 不能再extends它了// 9.多重继承 python c++类语言可以继承多个父级 但也因为带来了一些复杂性 所以java没有多重继承}
// 5.upcasting和downcasting的函数
// public static void show(UIControl control){//调用这个方法时 TextBox被自动转换成UIControl类型,这就是upcasting
// if (control instanceof TextBox){//control是否是TextBox class的实列
// var textBox=(TextBox)control;//显示转换此对象为TextBox类型
// textBox.setText("ddd");//这就是downcasting,使用时要确定传到这个函数里的对象它原本就是Textbox的实列,这样就可以安全地将其转换成TextBVox了
// }
// System.out.println(control);
// }
}
2.uicontrol.java
package org.example;public abstract class UIControl {//声明这一类为abstract后 此class不能再被实列化了 ,只能继承extends 它
// private boolean isEnabled = true;
protected boolean isEnabled = true;//protected is public in pacakage,即只要在package org.example;中isEnabled就是公共字段// public UIControl(boolean isEnabled) {
// this.isEnabled =isEnabled;
// System.out.println("ui conrol");
// }// public void enable(){
// isEnabled = true;
// }
public final void enable(){//final 方法是不能override的isEnabled = true;
}public void disable(){isEnabled = false;}public boolean isEnabled(){return isEnabled;}// 定义一个泛型方法
// public void render(){
//
// }public abstract void render();//声明此方法为abstract 删除{}编成方法的声明而不是实现
}
3.textbox class
package org.example;public class TextBox extends UIControl {
// textBox继承了uiconrol class中所有的特性
//private String text = "";// public TextBox() {
// super(true);//显示调用父级 extends对象的构造函数this.is//subclass不能访问 baseClass的private field methodsSystem.out.println("text box");
// }public void setText(String text) {this.text = text;}public void clear() {text = "";}@Override//这种叫注释,这一句的目的是告诉java我们重写了toString这个方法public String toString(){return text;}@Overridepublic void render() {System.out.println("render textbox");}
}
4.checkbox java
package org.example;//public abstract class CheckBox extends UIControl{//因为extends了ui control 这个render方法 要不就要实现 要不就要也声明为abstract@Overridepublic void render() {//这个render方法 要不就要实现 要不就要也声明为abstractSystem.out.println("render checkbox");}
//}
public final class CheckBox extends UIControl{//因为extends了ui control 这个render方法 要不就要实现 要不就要也声明为abstract@Overridepublic void render() {//这个render方法 要不就要实现 要不就要也声明为abstractSystem.out.println("render checkbox");}}//public class MyCheckBox extends CheckBox{}
//public class MyCheckBox extends String{}//String class是不可继承的
5.point.java
package org.example;import java.util.Objects;public class Point {private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}// @Override
// public boolean equals(Object obj) {
// if(this == obj)
// return true;
//
// if (!(obj instanceof Point))
// return false;
// var other = (Point) obj;
// return other.x == x && other.y == y;if (obj instanceof Point) {var other = (Point) obj;return other.x == x && other.y == y;}return false;
// }
//@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Point point = (Point) o;return x == point.x && y == point.y;}@Overridepublic int hashCode() {return Objects.hash(x, y);}
// @Override
// public int hashCode() {
// return Objects.hash(x,y);//哈希值理论上是 标志对象的唯一值
// }
}