1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Java SE_封装 继承 object类 super-this关键字 方法重写 多态 instanceof 类型转换

Java SE_封装 继承 object类 super-this关键字 方法重写 多态 instanceof 类型转换

时间:2019-02-08 12:44:37

相关推荐

Java SE_封装 继承 object类 super-this关键字 方法重写 多态 instanceof 类型转换

封装
该露的露,该藏的藏 我们程序设计要追求“高内聚,低耦合”。高内聚:类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。 封装(数据的隐藏) 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。 总结 属性私有(get/set) 新建一个学生类,访问修饰符为private。在main方法中实例化这个学生类对象,通过对象.属性的方式发现属性不可见,会报错。如果将Demo06类中的private String name;修饰符改为public则可访问。因为private属性为私有,所以即使外部new了对象也不能够使用操作到这个属性。所以在这里需要提供一些可以操作这个属性的方法。

package com.landray.object;//类public class Demo06 {// 封装大多时候都是针对于属性,对于方法比较少,重点是在属性中使用。// 名字private String name;// 学号private int id;// 性别private char sex;// 学习()// 睡觉()}

package com.landray.object;public class Application {public static void main(String[] args) {Demo06 student = new Demo06();//(name报错)The field Demo06.name is not visiblestudent.name = "";}}

封装的实现

package com.landray.object;//类public class Demo06 {// 封装大多时候都是针对于属性,对于方法比较少,重点是在属性中使用。// private属性私有// 名字private String name;// 学号private int id;// 性别private char sex;// 学习()// 睡觉()// 提供一些可以操作这个属性的方法// 提供一些public 的 get set方法// get 获得这个数据public String getName() {return this.name;}// set给这个数据设置值public void setName(String name) {this.name = name;}// 封装的使用// 以年龄赋值的范围是否合法为例,我们可以对age属性进行一些操作private int age;public int getAge() {return this.age;}public void setAge(int age) {// 如果输入不合法,则年龄赋值为3,否则就等于输入的年龄数if (age > 120 || age < 0) {this.age = 3;} else {this.age = age;}}}

package com.landray.object;public class Application {public static void main(String[] args) {Demo06 student = new Demo06();// student.name = "";student.setName("亚索");System.out.println(student.getName());// 不合法的年龄,我们可以在set方法中规避掉这些操作// 由于封装过了,我们可以在类中做一些安全性的检查student.setAge(9999);System.out.println(student.getAge());// 封装的意义// 1.提高程序的安全性,保护数据// 2.隐藏代码的实现细节(例如:用户只能调用年龄,并不知道我们在年龄中的设置判断是否合法)// 3.统一接口(所有的方法都是get、set)// 4.增加系统可维护}}

继承
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。extends的意思是“扩展”。子类是父类的扩展。JAVA中类只有单继承,没有多继承。继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。子类和父类之间,从意义上讲应该具有"is a"的关系。object类super方法重写

这里定义三个类分别是Person(人)、Student(学生)、Teacher(老师),从一种角度来说学生和老师都是属于人,从继承的角度来理解为(学生is a人、老师is a人),所以学生和老师都是可以继承人类的。从逆向的角度来来,这两种事物都是属于人类,所以我们又可以把这两种事物抽象出来一个人类。

package com.landray.demo01;//person 人:父类 public class Person {// public// protected// default(不写默认就是)// private(一般属性是私有的)private String name = "孙悟空";// 提供子类可以访问这个属性的方法getpublic String getName() {return name;}// 提供子类可以访问这个属性的方法setNamepublic void setName(String name) {this.name = name;}public int money = 10_0000_0000;public void say() {System.out.println("说了一句话");}}

package com.landray.demo01;//Student(学生) is 人: 派生类/子类//子类继承了父类,就会拥有父类的全部方法。public class Student extends Person {}

package com.landray.demo01;//Teacher(老师) is 人: 派生类/子类public class Teacher extends Person {}

package com.landray;import com.landray.demo01.Student;public class Application {public static void main(String[] args) {// 在这里new了一个student对象,调用其中的say()方法// 但是在Student中并存在这个方法还是能调用到// 是因为Student继承了Person类,这个方法在Person类中存在Student student = new Student();student.say();// 也能访问到Person中定义的变量moneySystem.out.println(student.money);// 访问name属性时报错(The field Person.name is not visible)// 是因为在父类中使用了private修饰符,为父类私有的属性,所以无法访问到。// 但是我们可以在父类中提供public方法的操作来实现访问要求// System.out.println(student.name);// 这里使用到封装数据提供的public方法来访问System.out.println(student.getName());// 输出 孙悟空}}

object类

给Person(父类)清空

package com.landray.demo01;//person 人:父类 //在Java中,所有的类都默认直接或者间接继承objectpublic class Person extends Object(可省略){//extends Object //可省略//没有显示的定义继承其他类,默认继承Object类}

在main方法中实例化Person对象,通过person.发现出现了没有定义的很多方法?

思考是不是有一个类跟无参构造一样看不见,但却存在?

在Java中,所有的类都默认直接或者间接继承object

package com.landray;import com.landray.demo01.Person;public class Application {public static void main(String[] args) {Person person = new Person();person.toString();}}

Super–this

定义一个Person类,Student类,和一个执行的main()方法。Student继承Person。验证得出以下结论:

package com.landray.demo01;public class Person {// 默认就存在的无参构造器public Person() {System.out.println("Person无参构造执行了");}protected String name = "盖伦";public void print() {System.out.println("Person");}// 私有的东西无法被继承private void prints() {System.out.println("Persons");}}

package com.landray.demo01;public class Student extends Person {// 默认就存在的无参构造器public Student() {// 隐藏代码:调用了父类的无参构造super();// 调用父类的构造器,必须要在子类构造器的第一行System.out.println("子类Student无参构造执行了");}private String name = "拉克丝";public void test1(String name) {System.out.println(name);// 塞拉斯(传递的当前参数)System.out.println(this.name);// 拉克丝(当前类)System.out.println(super.name);// 盖伦(父类)}public void test2() {print();// Studentthis.print();// Studentsuper.print();// Person// 即使继承了父类Person,但是prints()方法修饰符是私有的,所以这里通过super也并不能访问到。// 私有的无法被继承// super.prints();}public void print() {System.out.println("Student");}}

package com.landray;import com.landray.demo01.Student;public class Application {public static void main(String[] args) {// 1.实例化子类验证this、super关键字// Student student = new Student();// student.test1("塞拉斯");// student.test2();// 2.只实例化这个对象,执行内容为(Person无参构造执行了、子类Student无参构造执行了)// 说明在Student类中默认调用了父类的构造器super();Student student = new Student();}}

super注意点: 1.super调用父类的构造方法,必须在构造方法的第一个2.super必须只能出现在子类的方法或者构造器中(如果在父类中那就是object了)3.super和this不能同时调用构造方法(两个都要保证在第一行,所以会报错) 对比this注意点: 代表的对象不同: this:本身调用者这个对象super:代表父类对象的引用 前提: this:没有继承也可以使用super:只能在继承条件下才可以使用 调用构造方法区别: this():默认调用本类的构造super():默认调用父类的构造 方法重写(关乎多态)(override) 重写:需要有继承关系,子类重写父类的方法(和属性无关) 1.方法名必须相同2.参数列表必须相同3.修饰符范围可以扩大但不能缩小:public>protected>default>private4.抛出的异常:范围可以被缩小,但是不能扩大 重写,子类的方法和父类必须要一致,方法体不同。为什么需要重写: 父类的功能,子类不一定需要,或者不一定满足。

package com.landray.demo01;//重写都是方法的重写,和属性无关public class B {// 静态方法public static void test() {System.out.println("B======>test()");}// 非静态方法public void tests() {System.out.println("B======>tests()");}}

package com.landray.demo01;//继承public class A extends B {// 静态方法public static void test() {System.out.println("A======>test()");}// 非静态方法public void tests() {System.out.println("A======>tests()");}}

package com.landray;import com.landray.demo01.A;import com.landray.demo01.B;public class Application {// 静态的方法和非静态的方法区别很大// 静态方法:方法的调用只和左边,定义的数据类型有关// 重写只和非静态方法有关// 非静态方法才是重写// public才能重写,private不能重写。public static void main(String[] args) {// 静态方法-开始A a = new A();a.test();// A======>test()// 父类的引用指向了子类B b = new A();b.test();// B======>test()// 静态方法-结束// 非静态方法-开始A a1 = new A();a1.tests();// A======>tests()B b1 = new A();// 子类重写了父类的方法b1.tests();// A======>tests()// 非静态方法-结束}}

多态(动态编译、类型、可扩展性)
多态的语法格式:父类类名 引用名称 = new 子类类名(); [注意:当是多态时,该引用名称只能访问父类中的属性和方法,但是优先访问子类重写以后的方法多态:将多个对象调用同一个方法,得到不同的结果。]即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类/有关系的类)多态存在的条件 有继承关系子类重写父类方法父类引用指向子类对象 注意:多态是方法的多态,属性没有多态性。instanceof(类型转换-引用类型)-判断一个对象是什么类型多态注意事项: 1.多态是方法的多态,属性没有多态。2.父类和子类,存在联系。例如:不能把String类型转换为Person类型。否则存在类型转换异常(classCastException)3.存在的条件: 继承关系方法需要重写(如果不重写调用的都是各自的方法,就没有任何区别)父类引用指向子类对象(Father f1 = new Son()) 不能被重写情况: 1.static方法,属于类,不属于实例。2.final 常量池中。3.private方法私有不能被重写。 不能重写就无法实现多态。

package com.landray.demo01;public class Person {public void run() {System.out.println("run");}}

package com.landray.demo01;public class Teacher extends Person {@Overridepublic void run() {System.out.println("son");}public void eat() {System.out.println("eat");}}

package com.landray;import com.landray.demo01.Person;import com.landray.demo01.Teacher;public class Application {public static void main(String[] args) {// 1.新建Person类和Teacher类,Teacher继承Person。// 当我们在这里实例这个两个对象的时候,对象的实际类型是确定的。// Teacher teacher = new Teacher();// Person person = new Person();// 可以指向的引用类型就不确定了Teacher t1 = new Teacher();// Teacher能调用的方法都是自己的或者继承父类的// 父类的引用指向子类Person t2 = new Teacher();// 父类型,可以指向子类,但是不能调用子类独有的方法// 因为都继承于object类,所以也可以这么写Object t3 = new Teacher();// 1.在Person类中写下run()方法t2.run();// 输出 run(new的是子类但是还是走的父类的方法)// 2.在子类Teacher中,重写父类的run()方法(t2.run()和t1.run()都输出son)// t2.run()也输出son是因为子类重写了父类的方法,执行子类的方法t1.run();// 3.在Teacher中添加eat()方法t1.eat();// t2.eat();// 在Person中没有eat()方法,所以这样会报错。(可以指向子类,但是不能调用子类独有的方法)((Teacher) t2).eat();// 类型转换可以调用// 对象能执行哪些方法,主要看对象左边的类型,和右边关系不大。(看型来确定执行的方法,哪个类型就执行哪个类型中的方法,如果两个类型中都有这个方法,那就执行子类中的方法)}}

instanceof(判断一个对象是什么类型/是否存在父子关系/是否有联系)
创建三个类,关系如下:Person类为父类

package com.landray.demo02;public class Person {}

子类Student和Teache分别继续Person:

package com.landray.demo02;public class Teacher extends Person {}

package com.landray.demo02;public class Student extends Person {}

使用instanceof关键字判断类之间的关系如下:

package com.landray.demo02;public class Application {public static void main(String[] args) {// 当前类的关系:// 最外层的 Object > Person > Student// 最外层的 Object > Person > Teacher// 最外层的 Object > StringObject object = new Student();System.out.println(object instanceof Student);// trueSystem.out.println(object instanceof Person);// trueSystem.out.println(object instanceof Object);// trueSystem.out.println(object instanceof Teacher);// falseSystem.out.println(object instanceof String);// falseSystem.out.println("===========================");Person person = new Student();System.out.println(person instanceof Student);// trueSystem.out.println(person instanceof Person);// trueSystem.out.println(person instanceof Object);// trueSystem.out.println(person instanceof Teacher);// false// System.out.println(person instanceof String);// 编译报错System.out.println("===========================");Student student = new Student();System.out.println(student instanceof Student);// trueSystem.out.println(student instanceof Person);// trueSystem.out.println(student instanceof Object);// true// System.out.println(student instanceof Teacher);// 编译报错// System.out.println(student instanceof String);// 编译报错// 结论:// System.out.println(X instanceof Y);//能不能编译通过!}}

类型转换
创建两个类分别是: Person和Student类,Student继承Person。

package com.landray.demo02;public class Person {public void run() {System.out.println("run");}}

package com.landray.demo02;public class Student extends Person {public void go() {System.out.println("go");}}

类型转换步骤如下:

package com.landray.demo02;public class Application {public static void main(String[] args) {// 类型之间的转换:// 基本类型转换:高低转换 64 32 16 8, 高转低需要强转,低转高自动转换。// 父(高) 与 子(低)的类型转换。// 高 --------------------低Person obj = new Student();// 通过student.的方式并不能访问到Student中的go()方法。// 所以需要将这个对象转换为Student类型,就可以使用Student类型的方法了。// 方式一:Student std = (Student) obj;// 高转低std.go();// 方式二:((Student) obj).go();// 子类转换为父类,可能丢失自己本来的方法。Student student = new Student();student.go();// 低转高自动转换Person per = student;// 通过per.的方式并不能访问到student对象中的go()方法。子类转为父类丢失了方法。// 1.父类的引用指向子类的对象// 2.把子类转换为父类,向上转型// 3.把父类转换为子类,向下转型;强制转换// 4.方便方法的调用(不用重新去new一个类,升级或者降级来调用其他的方法),减少重复的代码,和利用率。}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。