java-learn(3):面对对象基础
·
文章目录
- 面对对象
-
- 设计对象并使用
- 封装
- this关键字
- 构造方法
- 标准javabean
- 对象内存图
-
- 一个对象的内存图
- 多个对象的内存图
- 两个变量指向同一个对象内存图
- this的内存原理
- 基本数据类型和引用数据类型的区别
- 局部变量和成员变量的区别
- 面对对象综合训练
-
- 文字格斗游戏
- 对象数组练习
面对对象
设计对象并使用
类:共同特征的描述
对象:是真实存在的具体实例
类的定义:
public class 类名{
1.成员变量
2.成员方法
}
获取类:
类名 对象名 = new 类名();
使用类:
对象.成员方法(...)
对象.成员属性;
一个代码文件中可以有多个类,但是只有一个类可以用public修饰的,public修饰的类名必须是java代码的文件名称
成员变量的定义格式:
修饰符 数据类型 变量名称 = 初始化值;
一般无需指定初始化值,系统默认的初始化值和在定义变量时是一样的
注意:
静态方法:
静态方法需要加上关键字static 它属于类 所以可以在类中直接调用 在类外 通过 类名.方法名() 就能直接调用
实例方法:
实例方法不需要加static 在类中调用需要先创建实例对象然后再调用 在类外也是一样
封装
原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为
1.private关键字是一个权限修饰符
2.可以修饰成员(成员变量和成员方法)
3.被private修饰的成员只能在本类中才能访问
public class GirlFriend {
private int age;
public void setAge(int a){
if(a >= 18 && a <= 50){
age = a;
}else{
System.out.println("非法数据");
}
}
public int GetAge(){
return age;
}
}
public class GirlFriendTest {
public static void main(String[] args){
GirlFriend g = new GirlFriend();
g.setAge(20);
System.out.println(g.GetAge());
}
}
this关键字
当参数名与类中的成员变量同名时,系统会实行就近原则,所以为了区分局部变量和全局变量 可以使用this关键字 this.成员变量
public class GirlFriend {
private int age;
public void setAge(int age) {
if(age >= 18 && age <= 50){
this.age = age;
}else{
System.out.println("非法数据");
}
}
public int GetAge(){
return age;
}
}
构造方法
/*
* 构造方法的作用:由虚拟机自动调用,给类中的成员变量初始化
* 构造方法的两种方式:
* 1.无参构造:不需要传入参数,成员变量初始化为默认值
* 2.有参构造:传入对应参数,给成员变量赋值
* 构造方法的注意事项:
* 当没有写构造方法时,虚拟机会默认创建一个无参构造,并调用
* 当调用有参构造时 就不会调用无参构造了
* 建议在有无有参构造时 都把无参构造加上
* */
public class GirlFriend {
private int age;
private String name;
public GirlFriend(){
System.out.println("hello world");
}
public GirlFriend(String name){
this.name = name;
}
public void setAge(int age) {
if(age >= 18 && age <= 50){
this.age = age;
}else{
System.out.println("非法数据");
}
}
public int GetAge(){
return age;
}
public String getName(){
return name;
}
}
标准javabean

public class user {
private String name,E_mail,password,gender;
private int age;
public user() {
}
public user(String name, String e_mail, String password, String gender, int age) {
this.name = name;
E_mail = e_mail;
this.password = password;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getE_mail() {
return E_mail;
}
public void setE_mail(String e_mail) {
E_mail = e_mail;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
对象内存图
一个对象的内存图
1.加载class文件
2.申请局部变量
3.在堆内存中开辟一个空间
4.默认初始化
5.显示初始化
6.构造方法初始化
7.将堆内存中的地址赋值给左边的局部变量
多个对象的内存图
两个变量指向同一个对象内存图
this的内存原理
this的本质:所在方法调用者的地址值
基本数据类型和引用数据类型的区别
局部变量和成员变量的区别
成员变量:类中方法外 会有默认值
局部变量:方法内,或者是方法的形参 没有默认值
面对对象综合训练
文字格斗游戏
这是格式化的输出方法
System.out.printf("%s",String);
键盘录入:
第一套体系:
nextInt(); 输入整数
nextDouble(); 输入浮点数
next(); 输入字符串
遇到空格 制表符 回车就停止接受数据
第二套体系
nextLine();
遇到回车才停止接收数据;
这两种体系不能混合使用 因为如果先用第一种体系
他最后留下来的回车会被第二套体系接收 导致第二套体系还没有收到他应该收到的数据就提前结束了 所以导致第二套体系收到的数据只是一个回车符
gameRole.java
import java.util.Random;
public class gameRole {
private String name;
private int blood;
private char gender;
private String face;
String[] boyfaces= {"风流俊雅","气宇轩昂","相貌英俊","五官端正","相貌平平","一塌糊涂","面目狰狞"};
String[] girlfaces ={"美奂绝伦","沉鱼落雁","婷婷玉立","身材娇好","相貌平平","相貌简陋","惨不忍睹"};
// attack 攻击描述:
String[] attacks_desc={
"%s使出了一招【背心钉】,转到对方的身后,一掌向%s背心的灵台穴拍去。",
"%s使出了一招【游空探爪】,飞起身形自半空中变掌为抓锁向%s。",
"%s大喝一声,身形下伏,一招【劈雷坠地】,捶向%s双腿。",
"%s运气于掌,一瞬间掌心变得血红,一式【掌心雷】,推向%s。",
"%s阴手翻起阳手跟进,一招【没遮拦】,结结实实的捶向%s。",
"%s上步抢身,招中套招,一招【劈挂连环】,连环攻向%s。"
};
// injured 受伤描述:
String[] injureds_desc={
"结果%s退了半步,毫发无损",
"结果给%s造成一处瘀伤",
"结果一击命中,%s痛得弯下腰",
"结果%s痛苦地闷哼了一声,显然受了点内伤",
"结果%s摇摇晃晃,一跤摔倒在地",
"结果%s脸色一下变得惨白,连退了好几步",
"结果『轰』的一声,%s口中鲜血狂喷而出",
"结果%s一声惨叫,像滩软泥般塌了下去"
};
public gameRole(){
}
public gameRole(String name,int blood,char gender){
this.name = name;
this.blood = blood;
this.gender = gender;
setFace(this.gender);
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getFace() {
return face;
}
public void setFace(char gender) {
Random r = new Random();
if(gender == '男'){
int index = r.nextInt(boyfaces.length);
this.face = boyfaces[index];
}else if(gender == '女'){
int index = r.nextInt(girlfaces.length);
this.face = girlfaces[index];
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
public void attack(gameRole r1){
Random r = new Random();
int index = r.nextInt(attacks_desc.length);
System.out.printf(attacks_desc[index],this.name,r1.name);
System.out.println();
System.out.printf(injureds_desc[index],r1.getName());
int hurt = r.nextInt(20)+1;
r1.setBlood((r1.blood - hurt < 0 ? 0:r1.blood - hurt));
}
}
gameRoleTest.java
public class gameRoleTest {
public static void main(String[] args){
gameRole r1 =new gameRole("小明",100,'男');
gameRole r2 =new gameRole("小美",100,'女');
while(true){
r1.attack(r2);
if(r2.getBlood() == 0){
System.out.println(r1.getName() +"ko了"+r2.getName());
break;
}
r2.attack(r1);
if(r1.getBlood() == 0){
System.out.println(r2.getName() +"ko了"+r1.getName());
break;
}
}
}
}
对象数组练习

类定义
public class Student {
private String id;
private String name;
private int age;
public Student() {
}
public Student(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试代码
import java.util.Scanner;
public class StudentTest {
private static int now_cnt = 0;
public static void main(String[] args){
Student[] arr =new Student[3];
// arr[now_cnt++] =new Student("heima002","小美",20);
// add_student(arr);
// print_Student(arr);
// delete_Student(arr,"heima001");
// print_Student(arr);
// quary_Student(arr,"heima002");
// print_Student(arr);
}
public static void add_student(Student[] arr){
if(now_cnt == arr.length) {
System.out.println("人数已近满了");
return;
}
System.out.println("请输入学生的学号 姓名 年龄:");
Scanner sc = new Scanner(System.in);
String id = sc.next();
String name = sc.next();
int age = sc.nextInt();
for (int i = 0; i < now_cnt; i++) {
if(id == arr[i].getId()){
System.out.println("学号重复 输入错误");
return;
}
}
arr[now_cnt++] = new Student(id,name,age);
System.out.println("添加成功");
return;
}
public static void print_Student(Student[] arr){
for (int i = 0; i < now_cnt; i++) {
System.out.println("学号:" + arr[i].getId() + "姓名:" + arr[i].getName() + "年龄:" + arr[i].getAge());
}
System.out.println("打印成功");
}
public static void delete_Student(Student[] arr,String id){
for (int i = 0; i < now_cnt; i++) {
if(id == arr[i].getId()){
for(int j = i+1;j < now_cnt;j++){
arr[j-1] = arr[j];
}
--now_cnt;
System.out.println("删除成功");
return;
}
}
System.out.println("删除错误 没有这个人");
return;
}
public static void quary_Student(Student[] arr,String id){
for (int i = 0; i < now_cnt; i++) {
if(id == arr[i].getId()){
System.out.println("查询成功!");
arr[i].setAge(arr[i].getAge()+1);
return;
}
}
System.out.println("查询失败!");
}
}
更多推荐

所有评论(0)