首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

面向对象的Java实现

1-1:封装 a.为什么需要封装(封装可以是数据方便维护、增加实用性、方便扩展等等。通过面向对象的思想,模拟现实生活中的事物。) b.什么是封装(封装就是将属性私有化,提供共有的方法访问私有属性) c.如何实现封装 例如: package s2java.sg.ch01; public class AccpTeacher3{ private String name;//教员姓名 private int age;//年龄 public String getName(){ return name; } public void setName(String MyName){ name=MyName; } public int getAge(){ return age; } public void setAge(int age){ if(age<22){ System.out.println("错误!最小年龄应为22岁!"); this.age=22;//若果不符合年龄要求,则赋予默认值 }else{ this.age=age; } } /* *返回自我介绍的内容 */ public String introduction(){ return "大家好!我是"+name+",我今年"+age+"岁"; } } 1-2:构造方法 a.为什么需要构造方法(使用构造方法可以给属性赋值。而且,实例化一个对象实际上就是去调用这个对象的构造方法。) b.什么是构造方法(构造方法负责对象成员的初始化工作,为实例变量赋予合适的初始值。) 构造方法必须满足以下语法规则:方法名与类名相同和没有返回类型。或者会所二名同、无返型。 c.带参数的构造方法(带参数的构造方法可以在构造方法中传递参数。) 在使用带参数的构造方法示例化对象时,传递的值和构造方法的参数应当在个数、次序和类型上互相匹配。 例如:AccpTeacher6 teacher=new AccpTeacher6("李名",23,"本科","咨询师"); 通过调用带参数的构造方法,在创建对象时,一并完成了对象成员的初始化工作,简化了对象初始化的代码。 1-3:方法重载 a.生活中的方法重载 例如: 一个司机可以驾驶不同的车子,虽然驾驶的行为实现各不相同,但是这些 操作都称为驾驶。驾驶这一行为就构成了生活中的方法重载。 b.方法重载的代码示例 例如: public static int max(int a,int b) public static int max(long a,long b) public static int max(float a,foat b) public static int max(double a,double b) 多次调用Math类的max()方法,分别进行不同的取最大值的操作。 例如: public class Test{ public static void main(String[] args){ Math.max(1,2); Math.max(1.0F,2.F); Math.max(1.0,2); } } c.构造方法重载(构造方法重载是方法重载的一个典型特例) 例如: package s2Java.sg.ch02; public class AccpTeacher7{ private String name;//教员姓名 private String school="北京中心";//所在中心 public AccpTeacher7(String name){ this.name=name;//设定教员姓名 } public AccpTeacher7(String name,String school){ this.name=name;//设定教员姓名 this.school=school;//设定教员的所在中心 } public String introduction(){ return "大家好!我是"+school+"的"+name; } } 例如: package s2java.sg.ch01; public class AccpTeacher7Test{ public static void main(String[] args){ AccpTeacher7 teacher1=new AccpTeacher7("李明"); System.out.println(teacher1.introduction()); AccpTeacher

01

JVM 《八 JVM JDK代理&CGLib 代理解析》

前言&背景 现在Spring 什么的好火。 Spring 很经典的一个特性是AOP AOP 的基础是代理。 代理分为静态代理、动态代理。 静态代理,不好处挺明显的,工程中各式各样的代理代码,过于冗余。 动态代理显得就简洁多了。 动态代理在java中现在大约有这么两种技术。JDK 原生反射,字节码操作增强反射(我第一次学到这个的时候感觉特别特别高大上,虽然现在也这么感觉 然后字节码操作技术 比较火的就是ASM了,也就是CGLib所使用的技术。 至于啥是代理,就不多解释了。就是产生一个代理操作来替代原核心操作并且增加一些便利的具有各个场景特性的附加操作。 然后JDK&CGLib表象上或者语法上的区别,一个面向接口、一个面向类、Spring 根据情况使用也可强制。然后单独使用的时候写法儿上的不同。 那在JVM层面去看待这个问题是怎样的呢? 其实本质要讨论的就是Java 反射、字节码操作具体是怎么样的,有什么区别。 先说一个反射的总体概念 反射,顾名思义 反着射,跟常规编写、编译、解释执行不同。我当时看反射的时候挺蒙蔽的,反射?反?射?到系统的看编程思想的RTTI那一块,对于反射的定义还有这个名字多少有点认可了。 下面是百度的解释,感觉挺糟糕的 也就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 一个比较可取的解释 Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions The primitive Java types (boolean, byte, char, short, int, long, float, anddouble), and the keyword void are also represented as Class objects. 综合起来看,也就是运行期间根据名称去动态的加载及使用一个编译期未知的类,然后根据加载进来的Class对象,来调用该类具体的方法的行为。(静态加载、根据已知信息直接使用) 为什么是反着呢,因为我们常规写程序都是既定使用的类&方法然后import、然后加载产生Class对象&使用类的具体信息 驱动执行。(已知信息使用) 而反射是在运行时除了名称完全未知,通过名称获取&加载进来,然后产生Class对象,通过Class 对象的信息来获取调用这个类具体的内容。(动态加载、透过 Class 获取信息去调用) 当然,这个类通常是远程调用或者别的什么方式来获取使用的。 Java反射也就是上面说的常规过程,来加载&使用一个完全未知的类。 而且JDK代理有个特点,是针对接口来实现的,也就是面向接口来编程,这也就导致了 接口一致而非对象一致。并且Java 反射效率总体来说是比较低下。 为了解决这些个问题,ASM之类的字节码操作技术出现了。

01
领券