Java - day5
五 面向对象 类与对象
5.5类与对象小结
用()调用刚发
5.6 封装
public class Student { //属性私有 private String name;//名字 private int id;//学号 private char sex;//性别 private int age; //提供一些可以操作这个属性的方法 //提供public 的get set方法 //get获取这个数据 public String getName(){ return this.name; } //set给这个数据设置值 public void setName(String name){ this.name = name; } //alt + insert 自动生成get set public int getAge() { return age; } public void setAge(int age) { if (age>120 ||age<0){//不合法 this.age = 3; }else { this.age = age; } } } /** * public static void main(String[] args) { * Student s1 = new Student(); * // s1.name = "1"; 私有不能调用 * s1.setName("123"); * System.out.println(s1.getName()); * s1.setAge(-1); * System.out.println(s1.getAge()); //3 * } */
5.7 封装
5.7.1 object类
ctrl +H 继承树
所有类都默认继承Object类
public class Person/*extends Object*/ { public void say(){ System.out.println("shuohua"); } private int money = 1_000_000; //不能直接操作private 但是可以调用方法进行操作 public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } }
5.7.2 Super类
//在Java中 所有的类 都默认直接或者间接继承object类 //父类Person public class Person/*extends Object*/ { public Person() { System.out.println("Person无参被执行了"); } protected String name = "父类里的名字"; //私有的东西没法被继承 public void print(){ System.out.println("Person"); } }
//子类 Student 继承了Person类 //学生 is person public class Student extends Person{ public Student() { //隐藏代码 调用了父类的无参构造 super();//调用了父类的构造器 必须要在子类构造器的第一行 System.out.println("Student无参被执行了"); } private String name = "继承类里的名字"; public void test(String name){ System.out.println(name);//测试中传入的名字 System.out.println(this.name);//继承类里的名字 System.out.println(super.name);//父类里的名字 } public void print(){ System.out.println("Student"); } public void test1(){ print(); //Student this.print(); //Student super.print(); //Person } }
public class Application { public static void main(String[] args) { Student s1 = new Student(); s1.test("测试中传入的名字"); s1.test1(); } }
5.7.3 方法重写
同名方法 子类和父类中的方法内容不同
有 这个箭头才能证明方法被重写了
public class B { public void text(){ System.out.println("B=>test()"); } }
public class A extends B{ //alt + insert //重写方法 与属性无关 @Override public void text() { System.out.println("A=>test()"); } }
public class Application { //static静态方法无法重写 public static void main(String[] args) { A a = new A(); a.text(); //A=>test() //父类引用指向了子类 B b = new A(); //子类重写了父类的方法 b.text(); //A=>test() } }
5.8 多态
public class Person { public void run(){ System.out.println("run"); } }
public class Student extends Person{ @Override public void run() { System.out.println("son"); } public void eat(){ System.out.println("eat"); } }
public class Application { public static void main(String[] args) { //一个对象的实际类型是确定的 // Student student = new Student(); // Person person = new Person(); //可以指向的引用类型不确定 :父类的类型可以指向子类 Student s1 = new Student(); //Person夫类型,可以指向子类,但是不能调用子类独有的方法 //可以强制类型转换 由高向低转换 Person s2 = new Student(); //左边的叫引用 右边的叫对象 Object s3 = new Student(); s1.run(); s2.run(); ((Student) s2).eat(); //可以强制类型转换 由高向低转换 // s3.run(); } } /** * 多态注意事项 * 1.多态是方法的多态 属性没有堕胎 * 2.父类和子类,有联系,类型转换异常 * 3.存在条件:继承关系,方法需要重写,父类引用指向子类对象 * * 1.static方法 方法属于类 不属于实例 * 2.final 常量 不能被重构 * 3.private 方法 */
Java中的多态和方法重写是两个不同的概念,虽然它们经常一起使用。
方法重写(Method Overriding)是指在子类中定义一个与父类中同名、同参数列表、同返回值类型的方法,并且该方法的访问修饰符不能比父类中定义的更严格。当子类对象调用该方法时,将执行子类中的方法而不是父类中的方法。方法重写可以实现对继承来的方法进行定制化改造,以适应子类特有的需求。
多态(Polymorphism)则是指同一种类型的对象,在不同的情况下具有不同的表现形式和行为。在Java中,多态性通常通过方法重写和方法重载等机制来实现。具体而言,当一个父类引用指向一个子类对象时,如果调用该引用的方法,就会根据实际引用的对象调用相应的方法(即父类或子类中具有相同名称和参数列表的方法)。这种行为被称为动态绑定(Dynamic Binding),也是Java中多态性的一种体现。
因此,方法重写是一种实现多态性的手段,而多态则是一种对象在不同情况下表现不同行为的特性。
5.8.1 instanceof(类型转换) 引用类型
判断一个对象时什么类型 可以判断两个类之间是否存在父子关系 有 true 没有 false
Student 和 Teacher类 都是 Person类的子类
public class Application { public static void main(String[] args) { //Object > String //Object > Person > Teacher //Object > Person > Student Object object = new Student(); System.out.println(object instanceof Student);//T System.out.println(object instanceof Person);//T System.out.println(object instanceof Object);//T System.out.println(object instanceof Teacher);//F 同级 System.out.println(object instanceof String);//F 不同类 System.out.println("=========="); Person person = new Student(); System.out.println(person instanceof Student);//T System.out.println(person instanceof Person);//T System.out.println(person instanceof Object);//T System.out.println(person instanceof Teacher);//F 是第三个比较 没有teacher //System.out.println(person instanceof String);//编译报错 System.out.println("=========="); Student student = new Student(); System.out.println(student instanceof Student);//T System.out.println(student instanceof Person);//T System.out.println(student instanceof Object);//T //System.out.println(student instanceof Teacher);//编译报错 // System.out.println(student instanceof String);//编译报错 }
5.8.2 强制类型转换
public static void main(String[] args) { //类型之间的转化: 父 子 //由gao向do 强转 //子类转化成父类:可能会丢失自己本来的方法 Student student = new Student(); student.go(); Person person = student; } /* 1.父类引用指向子类对象 2.把子类转换为父类 向上转型 可能会丢失自己本来的方法 3.把父类转换为子类 向下转型 强转 同时拥有父类和子类的方法 4.方便方法调用 减少重复代码 简洁 */