【原】Java学习笔记015 - 面向对象
- package cn.temptation;
- public class Sample01 {
- public static void main(String[] args) {
- // 传递 值类型参数 和 传递 引用类型参数
- int i = 2;
- int j = 3;
- System.out.println("方法调用前:i = " + i + ",j = " + j);
- Calc calc = new Calc();
- int result = calc.add(i, j);
- System.out.println("方法调用后:i = " + i + ",j = " + j);
- // 这里的i 和 j 是main主函数中的局部变量,它们无法参与到对象的成员方法的运算中的,"井水不犯河水"
- StudentTest studentTest = new StudentTest();
- // 在创建了StudentTest类的对象后,使用 对象名.成员方法()来进行调用,对于test这个成员方法,需要传入类型为Student类类型的实参,到底需要传入什么东西给它?
- // 需要的是一个类类型的东西,可以传递一个类名称过去么? 答:不可以的,语法错误
- // Student cannot be resolved to a variable
- // studentTest.test(Student);
- // 考虑到类是模板是抽象的东西,这里不需要抽象的类名称,而是需要传入一个具体的对象实例
- Student student = new Student();
- System.out.println(student);
- student.age = 18;
- System.out.println("方法调用前,age = " + student.age);
- // 依据类这个模板创建出来的对象自然应该是这个模板类的类型
- studentTest.test(student); // 也就是传递了一个Student类类型的实例对象
- System.out.println("方法调用后,age = " + student.age);
- }
- }
- // 定义计算类
- class Calc {
- // 成员变量
- // 成员方法
- // 方法的形参是值类型
- public int add(int i, int j) {
- i *= 2;
- j *= 3;
- System.out.println("方法中:i = " + i + ",j = " + j);
- return i + j;
- }
- }
- // 定义学生类
- class Student {
- // 成员变量
- int age;
- // 成员方法
- public void say() {
- System.out.println("春眠不觉晓");
- }
- }
- // 定义学生类的测试类
- class StudentTest {
- // 成员方法
- public void test(Student student) {
- System.out.println(student);
- // 67行打印出的内容 和 25行打印出的内容一致,其实就是告诉test方法,使用的形参student就是在内存中的堆上使用方法调用前通过new创建出来的那一块空间
- student.age = 99;
- }
- }
- /*
- * 值类型、引用类型给方法传递的规则:
- * 1、形参为值类型时:实参传递过来的是数据值,形参的改变对实参没有影响
- * 2、形参为引用类型时:实参传递过来的是引用(地址,堆内存中的空间),形参的改变对实参会有影响
- */
- package cn.temptation;
- public class Sample02 {
- public static void main(String[] args) {
- // 匿名数组
- // Syntax error, insert "AssignmentOperator Expression" to complete Expression
- // The left-hand side of an assignment must be a variable
- // new int[] { 1, 2, 3 };
- // 上述写法有语法错误,因为匿名函数只能使用一次,考虑放在方法中作为实参来使用
- // 对象的创建(类的实例化)
- // Person person = new Person();
- // System.out.println(person); // cn.temptation.Person@15db9742
- // person.say();
- // 匿名对象
- // 下句没有语法错误,但是如何使用通过new关键字在堆中开辟出来的空间呢?
- // new Person();
- // 下句把new Person()执行的结果作为实参传递给打印方法,打印出的结果说明new Person()这句话的确是创建出了一个匿名对象
- // System.out.println(new Person()); // cn.temptation.Person@15db9742
- // 匿名对象如何使用成员变量 和 成员方法?
- // 我们已经知道的是 对象名.成员变量 和 对象名.成员方法,所以类推 匿名对象.成员变量 和 匿名对象.成员方法
- // (new Person()).age = 18;
- // 下句打印结果为0,为何?
- // 答:上句使用new 关键字创建了一个匿名对象,下句使用了new 关键字又创建了一个匿名对象,自然使用的是其默认值
- // System.out.println((new Person()).age); // 0
- // 下面两句输出的结果没有区别,虽然是不同的匿名对象
- // (new Person()).say();
- // (new Person()).say();
- // 匿名对象的优缺点:
- // 优点:随时定义,随时使用
- // 缺点:只能使用一次
- }
- }
- //// 定义人类
- //// 只写class关键字,不写类名去实现匿名类,语法错误
- //// 语法错误:Syntax error on token "class", Identifier expected after this token
- ////class {
- //class Person {
- // // 成员变量
- // int age;
- //
- // // 成员方法
- // public void say() {
- // System.out.println("说话");
- // }
- //}
- package cn.temptation;
- public class Sample03 {
- public static void main(String[] args) {
- // 成员变量的数据保护
- Person person1 = new Person();
- person1.name = "张三";
- // 对age这个成员变量使用了private后,提示 The field Person.age is not visible 语法错误
- // person1.age = 18;
- person1.show();
- Person person2 = new Person();
- person2.name = "李四";
- // 直接拿着成员变量使用(赋值和取值),产生了不正常的错误数据
- // 因为缺少对成员变量数据范围的检查
- // 对age这个成员变量使用了private后,提示 The field Person.age is not visible 语法错误
- // person2.age = 160;
- person2.show();
- Person person3 = new Person();
- person3.name = "王五";
- person3.setAge(200);
- person3.show();
- // 成员变量的数据保护的方案:
- // 将成员变量设置为private,通过成员方法去访问它,来实现对成员变量的数据保护
- }
- }
- class Person {
- // 成员变量
- // 对于不合理的数据,首先想的是在成员变量上做文章,考虑到成员变量能被随意的访问,所以会被随意的赋值
- // 自然考虑如果不能被访问,自然也就不能被赋值,也就不会有不合理的数据
- // 对于成员变量设置为不能访问,Java中提供了一个关键字 private 私有的
- String name;
- // int age;
- private int age; // 给成员变量加上private关键字,它不能被访问了,但是这不是我们想要的最终结果
- // 因为成员变量不加private,就可以随意赋值,加了private又无法访问,这里就需要考虑结合其他的途径
- // 考虑到还要使用这个特征age,如果给age进行赋值时有相应的检查就好了,显然不是一句语句可以完成,既然是需要多个语句来做这个事情
- // 自然有想到要使用多个语句的封装形式-----方法,使用方法对赋值进行检查
- // 同时观察到要制作的这个检查方法是和成员变量在同一个类中的方法,即成员变量使用了private修饰符,在这个检查方法中也可以访问到
- // 成员方法
- public void setAge(int personAge) {
- if (personAge < 0 || personAge > 120) {
- System.out.println("设置的年龄不正确!!!");
- } else {
- age = personAge;
- }
- }
- public void show() {
- System.out.println("姓名为:" + name + ",年龄为:" + age);
- }
- }
- package cn.temptation;
- public class Sample04 {
- public static void main(String[] args) {
- // private 关键字的用法
- Man man = new Man();
- man.name = "王五";
- // 语法错误:The field Man.age is not visible
- // man.age = 28;
- man.show1();
- // 使用private修饰的成员变量无法访问
- // 语法错误:The method show2() from the type Man is not visible
- // man.show2();
- man.show3();
- // 语法错误:The method show4() from the type Man is not visible
- // man.show4();
- }
- }
- // 定义一个Man类
- class Man {
- // 成员变量
- String name;
- // 成员变量age没有使用默认值,给其赋值为18
- private int age = 18;
- // 成员方法
- public void show1() {
- System.out.println("这是public修饰的show1方法");
- }
- private void show2() {
- System.out.println("这是private修饰的show2方法");
- }
- public void show3() {
- // private修饰的成员变量age在本类的成员方法中可以被访问到,不论本类的成员方法是public修饰的,还是private修饰的
- System.out.println(age);
- }
- private void show4() {
- // private修饰的成员变量age在本类的成员方法中可以被访问到,不论本类的成员方法是public修饰的,还是private修饰的
- System.out.println(age);
- }
- }
- package cn.temptation;
- public class Sample05 {
- public static void main(String[] args) {
- // 通过制作setXXX(...)实现对成员变量进行赋值操作
- // 通过制作getXXX(...)实现对成员变量进行取值操作
- Animal animal = new Animal();
- animal.setName("狗");
- animal.setWeight(10);
- System.out.println("名称为:" + animal.getName() + ",体重为:" + animal.getWeight());
- }
- }
- // 定义动物类
- class Animal {
- // 成员变量
- // 名称
- private String name;
- // 体重
- private int weight;
- // 成员方法
- public void setName(String animalName) {
- // 通过形参从外部接收到数据,把数据赋值给设置为private的成员变量
- name = animalName;
- }
- public String getName() {
- return name;
- }
- public void setWeight(int animalWeight) {
- // 通过形参从外部接收到数据,把数据赋值给设置为private的成员变量
- weight = animalWeight;
- }
- public int getWeight() {
- return weight;
- }
- }
- package cn.temptation;
- public class Sample06 {
- public static void main(String[] args) {
- // // 需求:定义一个手机类,三个成员变量品牌brand,价格price,颜色color,使用成员变量数据保护
- // Phone phone = new Phone();
- // phone.setBrand("iphone 7");
- // phone.setPrice(5888);
- // phone.setColor("白色");
- //
- // System.out.println("手机品牌为:" + phone.getBrand() + ",价格为:" + phone.getPrice() + ",颜色为:" + phone.getColor());
- }
- }
- //// 定义手机类
- //class Phone {
- // // 成员变量
- // // 品牌
- // private String brand;
- // // 价格
- // private int price;
- // // 颜色color
- // private String color;
- //
- // // 成员方法
- // public void setBrand(String param) {
- // brand = param;
- // }
- //
- // public String getBrand() {
- // return brand;
- // }
- //
- // public void setPrice(int param) {
- // price = param;
- // }
- //
- // public int getPrice() {
- // return price;
- // }
- //
- // public void setColor(String param) {
- // color = param;
- // }
- //
- // public String getColor() {
- // return color;
- // }
- //}
- package cn.temptation;
- public class Sample07 {
- public static void main(String[] args) {
- // 思考一下创建对象这一步,通过类的实例化
- // 观察一下new这一部分,new关键字后面写的是一个带有小括号的东西,这个小括号让我们联想到了方法(函数)
- // 1、从形式来看,创建对象好像是从new一个方法得到的
- // 2、这个写在new后面的方法在类中没有看到
- // 这个方法称为 Java中的 构造方法(构造函数)
- // 构造函数定义:用来创建对象时使用的方法
- // 类中可以不写构造函数,由JDK自动生成出构造函数
- // 通过使用XJad反编译工具对.class字节码文件进行反编译,查看一下JDK的确自动生成了构造函数
- Girl girl = new Girl();
- // 注意:有几个类,对应就有几个.class文件,在定义类时,eclipse就自动为我们生成了对应的.class文件
- }
- }
- //定义妹纸类
- class Girl {
- // 成员变量
- private String name;
- // 成员方法
- public void setName(String girlName) {
- name = girlName;
- }
- public String getName() {
- return name;
- }
- }
- package cn.temptation;
- public class Sample08 {
- public static void main(String[] args) {
- // JDK生成出来的构造函数的特点:
- // 1、无修饰符
- // 2、无返回值类型,也没有返回值
- // 3、无参数
- // 4、方法名和类名一致
- // 手写一个构造函数
- // 1、手写一个构造函数,JDK不再为类自动生成构造函数
- // 2、创建对象时,执行了写在构造函数中的语句
- // 3、构造函数比所有的成员方法都要先执行,理解:小鸟还在蛋里,就要它飞行,不现实
- Bird bird = new Bird();
- bird.say();
- }
- }
- class Bird {
- // 成员变量
- // 构造函数
- // 不使用修饰符修饰的构造函数
- Bird() {
- System.out.println("我是Bird的构造函数");
- }
- // 使用public可以修饰构造函数
- // public Bird() {
- // System.out.println("我是Bird的构造函数");
- // }
- // 使用private也可以修饰构造函数,但是使用private修饰后,进行类的实例化时出现语法错误:The constructor Bird() is not visible
- // private Bird() {
- // System.out.println("我是Bird的构造函数");
- // }
- // 成员方法
- public void say() {
- System.out.println("这是成员方法say");
- }
- }
- package cn.temptation;
- public class Sample09 {
- public static void main(String[] args) {
- // 思考这样的场景:对于小孩子被生出来,正常情况就有两个手、两个脚
- // 下面写法:创建出Baby对象,再使用setXXX方法进行赋值,这样的写法对使用者有要求,创建出对象后不能忘记使用setXXX方法
- Baby baby1 = new Baby();
- baby1.setHands(2);
- baby1.setLegs(2);
- System.out.println("手为:" + baby1.getHands() + "只,脚为:" + baby1.getLegs() + "只");
- // 考虑在创建对象时就应该初始化赋值,自然考虑在构造函数上做处理
- // 可以根据开发人员的需要,制作多种多样的构造函数的重载方法
- Baby baby2= new Baby(2, 2);
- System.out.println("手为:" + baby2.getHands() + "只,脚为:" + baby2.getLegs() + "只");
- // 注意:
- // 1、没有有参构造函数,也没有无参构造函数,那么JDK会自动生成无参构造函数
- // 2、编写有参构造函数,不写无参构造函数,那么那些使用了无参构造函数创建兑现搞得语句就会有语法错误The constructor Baby() is undefined
- // 反编译字节码文件,发现此时JDK是不会自动生成无参构造函数
- // 大家使用构造函数时,建议把无参构造函数都手写补上
- }
- }
- // 小孩子类
- class Baby {
- // 成员变量
- private int hands;
- private int legs;
- // 构造函数(无参)
- public Baby() {
- System.out.println("这是Baby的无参构造函数");
- }
- // 构造函数(有参)
- public Baby(int babyHands, int babyLegs) {
- System.out.println("这是Baby的有参构造函数");
- hands = babyHands;
- legs = babyLegs;
- }
- // 成员方法
- public void setHands(int babyHands) {
- hands = babyHands;
- }
- public int getHands() {
- return hands;
- }
- public void setLegs(int babyLegs) {
- legs = babyLegs;
- }
- public int getLegs() {
- return legs;
- }
- }
- package cn.temptation;
- public class Sample10 {
- public static void main(String[] args) {
- // 需求:创建手机类,有品牌、价格、颜色,默认出厂标识码(pinCode),使用private成员变量、构造函数、set方法、get方法
- Phone phone = new Phone("xiaomi", 1200, "白色", "A123456");
- phone.show();
- }
- }
- // 定义手机类
- class Phone {
- // 成员变量
- // 品牌
- private String brand;
- // 价格
- private int price;
- // 颜色color
- private String color;
- // 出厂标识码
- private String pinCode;
- // 构造函数(无参)
- public Phone() {
- System.out.println("这是无参构造函数");
- }
- // 构造函数(有参)
- public Phone(String phoneBrand, int phonePrice, String phoneColor, String phonePinCode) {
- brand = phoneBrand;
- price = phonePrice;
- color = phoneColor;
- pinCode = phonePinCode;
- }
- // 成员方法
- public void setBrand(String param) {
- brand = param;
- }
- public String getBrand() {
- return brand;
- }
- public void setPrice(int param) {
- price = param;
- }
- public int getPrice() {
- return price;
- }
- public void setColor(String param) {
- color = param;
- }
- public String getColor() {
- return color;
- }
- public void setPinCode(String param) {
- pinCode = param;
- }
- public String getPinCode() {
- return pinCode;
- }
- // 自定义的成员方法
- public void show() {
- System.out.println("品牌为:" + brand + ",价格为:" + price + ",颜色为:" + color + ",出厂标识码为:" + pinCode);
- }
- }
【原】Java学习笔记015 - 面向对象的更多相关文章
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...
- 【原】Java学习笔记019 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...
- 【原】Java学习笔记016 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // this 关键字 ...
- 【原】Java学习笔记014 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 面向对象思想 // ...
- 【原】Java学习笔记020 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 成员方法的参数列表 ...
- 【原】Java学习笔记018 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 继承关系的子类可以 ...
- 【原】Java学习笔记017 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 继承关系中的pri ...
随机推荐
- .NET Core 2.0迁移技巧之web.config配置文件
大家都知道.NET Core现在不再支持原来的web.config配置文件了,取而代之的是json或xml配置文件.官方推荐的项目配置方式是使用appsettings.json配置文件,这对现有一些重 ...
- 【web.xml】项目从web.xml开始
前言 依自己目前的所闻所见,每个项目的WEB-INF下都会带有一个web.xml配置文件.当启动项目时,web容器(tomcat)会首先去读取web.xml中的内容,读取加载完成后才算完成了项目的启动 ...
- 有了iron-node,调试Nodejs就是怎么so easy
全局安装 iron-node工具 cnpm install -g iron-node 运行iron-node iron-node ./build/dev-server.js 调试效果图
- 2016年,总结篇 续 如何从 JQ 转到 VueJS 开发(一)
接着 2016 年的总结,我们来看看 2016年 国内最火且没有之一的前端MVVM 框架 VueJs 虽然 到写文章的这个时间点,VueJs已经发布了 2.1.x 了, 但是对于很多 Vuejs 的初 ...
- Android Studio升级到3.1.4后打开旧项目警告:The `android.dexOptions.incremental` property is deprecated and it has no effect on the build process.
现象截图 问题原因&解决方案 在build.gralde中,对Android开发过程中突破的方法数的限制,做了如下解决配置: dexOptions { incremental true jav ...
- Java基础5:抽象类和接口
本文主要介绍了抽象类和接口的特性和使用方法. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.g ...
- PE知识复习之PE的导出表
PE知识复习之PE的导出表 一丶简介 在说明PE导出表之前.我们要理解.一个PE可执行程序.是由一个文件组成的吗. 答案: 不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就 ...
- SpringMVC学习笔记之一(SpringMVC架构及与Mybatis整合)
一.SpringMVC入门 1.1Springmvc是什么 Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如 ...
- 【转载】ASP.NET MVC重写URL制作伪静态网页,URL地址以.html结尾
在搜索引擎优化领域,静态网页对于SEO的优化有着很大的好处,因此很多人就想把自己的网站的一些网页做成伪静态.我们现在在网络上发现很多博客网站.论坛网站.CMS内容管理系统等都有使用伪静态这一种情况,伪 ...
- [PHP] defunct僵尸进程
1.如果子进程先于父进程退出, 同时父进程又没有调用wait/waitpid,则该子进程将成为僵尸进程 2.如果fork完就不管了可以使用 忽略子进程信号, 防止僵尸进程 pcntl_signal(S ...