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 - 面向对象的更多相关文章

  1. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

  2. Java学习笔记之面向对象、static关键字

    一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...

  3. Java 学习笔记(4)——面向对象

    现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...

  4. 【原】Java学习笔记019 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...

  5. 【原】Java学习笔记016 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // this 关键字 ...

  6. 【原】Java学习笔记014 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 面向对象思想 // ...

  7. 【原】Java学习笔记020 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 成员方法的参数列表 ...

  8. 【原】Java学习笔记018 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 继承关系的子类可以 ...

  9. 【原】Java学习笔记017 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 继承关系中的pri ...

随机推荐

  1. python编程实战

    1.计算对称平方数 题目描述 打印所有不超过n(n<256)的,其平方具有对称性质的数,如11*11=121. 输入描述 无 输出描述 每行一个数,表示对称平方数 def f(n): flag ...

  2. 有了这 4 大特性,CDN 好用到飞起

    随着 CDN 市场的快速发展和网络新技术的不断涌现,目前的 CDN 已不仅仅是当初简单的内容分发,同时也是新特性研发.新技术推广及实践的平台.这些新技术.新特性,或者能够保障 CDN 安全性,或是提升 ...

  3. 我曾做过陈士成,也做过孔乙己,还做过阿Q

    一. 我现在是陈士成,陈士成现在是我.为什么这么说呢? 那年那天,天刚微微亮,似乎还在打着哈欠.我和父亲去得很早,为的就是在“小升初的考试成绩榜单”前面占一个有利的位置.我不记得当时穿的厚还是不厚,体 ...

  4. 成熟的 Git 分支模型

    个人博客原文: 成熟的 Git 分支模型 今天介绍一下工作中会用到的 Git 分支模型. 先贴上图以表敬意 闲言 在学校不管是自己写课程设计还是给老师做项目,有 2 到 3 个人一起协作开发时就会使用 ...

  5. Spring Boot Security

    如图,是一种通用的用户权限模型.一般情况下会有5张表,分别是:用户表,角色表,权限表,用户角色关系表,角色权限对应表. 一般,资源分配时是基于角色的(即,资源访问权限赋给角色,用户通过角色进而拥有权限 ...

  6. Android--从系统Gallery获取图片

    前言 在Android应用中,经常有场景会需要使用到设备上存储的图片,而直接从路径中获取无疑是非常不便利的.所以一般推荐调用系统的Gallery应用,选择图片,然后使用它.本篇博客将讲解如何在Andr ...

  7. 《HelloGitHub月刊》第 04 期(秋招临近,本期加入了面试相关的项目)

    兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个人能力有限,其他语言涉及甚少,欢迎各路人士加入, ...

  8. 使用mpvue开发小程序教程(二)

    在上篇文章中,我们介绍了使用mpvue开发小程序所需要的一些开发环境的搭建,并创建了第一个mpvue小程序代码骨架并将其运行起来.在本文中,我们来研究熟悉一下mpvue项目的主要目录和文件结构. 在V ...

  9. leetcode — unique-binary-search-trees

    /** * Source : https://oj.leetcode.com/problems/unique-binary-search-trees/ * * * Given n, how many ...

  10. SLAM入门之视觉里程计(1):特征点的匹配

    SLAM 主要分为两个部分:前端和后端,前端也就是视觉里程计(VO),它根据相邻图像的信息粗略的估计出相机的运动,给后端提供较好的初始值.VO的实现方法可以根据是否需要提取特征分为两类:基于特征点的方 ...