回顾
万物皆对象
学习程序的目的:解决现实的问题。
前提:模拟现实世界
小明(人) – 人类
public class Human {
String name;
String gender;
int height;
int weight;
}
public class Bear {
}
public class Computer {
}
Human man = new Human();
man.name = "小明";
man.gender = "男";
man.height = 168;
man.weight = 160;
实例变量和局部变量的区别:
方法的重载:
- 方法的签名(唯一性)
- 在一个类中,方法名相同,参数列表不同就叫做方法的重载
今日内容
1. 构造方法
- 无参构造方法
- 没有参数
- 有参构造方法
- 有参数
定义:
public 类名() {
}
public 类名(参数列表) {
}
- 构造方法
- 构造方法,不能被直接调用,只能在创建对象时调用(new)
- 如果不自己定义一个构造器,那么系统就默认有一个无参构造方法
- 一旦自己定义一个构造器(无参,有参都可),那么就没有默认的无参构造方法了
package com.qf;
/*
* 文件名为Demo01.java
* 那么该文件只能定义一个public修饰的类,且类名必须和java文件名一致
* 但是可以定义很多不用public修饰的类 default
*/
public class Demo01 {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p);
//表示自己
Student stu = new Student();
stu.name = "小帅哥";
stu.code = "888888";
stu.gender = "男";
stu.cardId = "666999";
Student stu2 = new Student("jackma","9999","男","123456");
/*
* 通过 对象名.属性名 可以获取属性值
*/
String name = stu2.name;
String code = stu2.code;
String gender = stu2.gender;
String cardId = stu2.cardId;
System.out.println("name:"+name+" code:"+code+" gender:"+gender+" cardId:"+cardId);
System.out.println("----------------------------");
Computer c = new Computer("华为",5600,"i5","8G");
}
}
class Person {
/*
*
*/
public Person() {
System.out.println("执行Person无参构造方法");
}
}
class Student {
String name;
String code;
String gender;
String cardId;
/*
* 构造方法
*/
public Student() {
}
/*
* 有参构造方法
* 目的: 在创建对象的时候(new),为属性赋值
* 在什么时候创建呢? 在需要的时候创建
*/
public Student(String n, String c, String g, String id) {
System.out.println("执行有参构造方法--");
name = n;
code = c;
gender = g;
cardId = id;
}
}
class Computer {
//定义四个属性 品牌 价格 cpu 内存
String brand;
double price;
String cpu;
String ram;
public Computer(String b, double p, String c, String r) {
brand = b;
price = p;
cpu = c;
ram = r;
}
}
2. this
在有参构造器中,实例变量和局部变量可能会相同
在相同的作用范围中,会优先使用局部变量
可以使用this关键字使用类中的全局变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z29dFWej-1646829039517)(image-20220309144026907.png)]
package com.qf;
public class Demo02 {
public static void main(String[] args) {
}
}
class Phone {
String brand;
double price;
String cpu;
String ram;
/*
* 1. 允许出现同名的全局变量和局部变量
* 2. 在相同的作用范围中,优先使用局部变量
* 3. this就是指向堆内存中的该对象
*/
public Phone(String brand, double price, String cpu, String ram) {
this.brand = brand;
this.price = price;
this.cpu = cpu;
this.ram = ram;
}
public Phone(String brand, double price) {
this.brand = brand;
this.price = price;
}
public Phone(String brand, double price, String cpu) {
this.brand = brand;
this.price = price;
this.cpu = cpu;
}
public Phone(String brand) {
this.brand = brand;
}
/*
* 右击 -- source -- Generate Constructor using Fields --- 选择相应的属性生成
*
* 一旦生成一个有参,一定给他无参 alt+/
*/
public Phone() {
}
}
class Cup {
/*
* 自定义四个属性
* 自动生成4个构造方法
*/
String brand;
double price;
String name;
int capacity;
public Cup(String brand) {
super();
this.brand = brand;
}
public Cup(double price) {
super();
this.price = price;
}
public Cup(int capacity) {
super();
this.capacity = capacity;
}
public Cup(String brand, double price) {
super();
this.brand = brand;
this.price = price;
}
public Cup(String brand, String name) {
super();
this.brand = brand;
this.name = name;
}
public Cup(String brand, int capacity) {
super();
this.brand = brand;
this.capacity = capacity;
}
}
3. 面向对象特征
抽象,封装,继承,多态
- 抽象 抽取一个事情重要的特性
- 封装 重要的东西,只能自己用,别人不能获取 属性的私有化
- 继承 类别与类别之间的关系
- 多态 相同的种类,执行相同的操作,得到的结果却不一样
3.1 封装
- 属性私有
- 为私有属性,添加set,get方法
package com.qf;
public class Person {
private String name;
private String gender;
/*
* 如果一个属性,使用private修饰, 那这就叫做封装
* 表示这个属性只能在本类中操作,在其他任何地方都不能操作(赋值,获取值)
* 这种属性,私有属性
*/
private int age;
public Person() {
}
//1.1 定义有参构造器,为属性赋值
public Person(int age) {
this.age = age;
}
//1.2 通过实例方法赋值
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setGender(String gender) {
this.gender = gender;
}
//1.3 获取age值的方法
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public void printSelf() {
System.out.println("name:"+name+" gender:"+gender+" age:"+age);
}
}
package com.qf;
public class Phone {
private String brand;
private double price;
private String cpu;
private String ram;
/*
* 自动生成
*
* 右击 -- source --
*/
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
//重写toString
/*
* @Override public String toString() { return "Phone [brand=" + brand +
* ", price=" + price + ", cpu=" + cpu + ", ram=" + ram + "]"; }
*/
}
package com.qf;
public class Test01 {
public static void main(String[] args) {
Person p = new Person(18);
p.printSelf();
Person p2 = new Person();
p2.setAge(17);
p2.setName("pony");
p2.printSelf();
int age = p2.getAge();
System.out.println();
String name = p2.getName();
System.out.println(name);
Phone phone = new Phone();
phone.setBrand("华为");
phone.setPrice(3500);
phone.setCpu("麒麟");
phone.setRam("8G");
System.out.println(phone);
}
}