//类:抽象的概念,通过实例化去创建对象,从而操作数据
public class Person {
//属性/全局变量
//分类:成员属性、静态属性
//成员属性:每个对象独有一份
String name;
char sex;
int age;
//静态属性:每个对象共享一份
static String star = "earth";
//方法
//分类:构造方法、成员方法、静态方法
//构造方法 -- 无参构造
//注意:当该类没有有参构造的情况,系统会默认实现无参构造
//经验:写了有参,记得把无参一起写上
public Person(){
this("彭于晏",'男',18);
}
//构造方法
public Person(String name,char sex,int age){
this.name = name;
this.sex = sex;
this.age = age;
}
//成员方法
public void eat(){
System.out.println(name + "吃饭饭");
System.out.println(name);//this.name
System.out.println(star);//Person.star
}
//成员方法
public void sleep(){
System.out.println(name + "睡觉觉");
}
//静态方法
public static void method(){
System.out.println("静态方法 ");
}
}
扩展:
/**
- 成员变量 和 静态变量的区别?
成员变量:
1.每个对象独有一份
2.new对象时在堆内存开批空间
静态变量:
1.每个对象共享一份
2.加载class文件时,JVM会扫描该类所有的属性,并在静态区中开辟空间存储静态属性
3.项目结束时才会将静态区中的数据回收
- 成员变量 和 局部变量的区别?
成员变量:
1.成员变量作用在该类中所有的成员方法中
2.成员变量系统会赋默认值
3.成员变量会随着对象的存在而存在,消失而消失
局部变量:
1.局部变量作用在当前方法中
2.局部变量系统不会赋默认值
3.局部变量调用方法时才会在栈内存开辟空间,方法结束局部变量会被立刻回收
- 静态方法为什么不能调用成员变量?
静态方法直接使用类名调用,如果该方法里调用成员变量(this.name),this表示调用该方法的对象,而静态变量又是使用类名调用,这就冲突了!
- 构造方法的特点有什么?
1.与类名相同
2.没有返回项
- 构造方法的作用?
1.和new关键字一起创建对象
2.初始化数据
- 成员方法 和 静态方法的区别?
成员方法:
1.使用对象调用
2.成员方法可以调用成员属性和静态属性
3.应用场景:对象自己的方法
静态方法:
1.使用类名调用
2.静态方法只能调用静态属性
3.应用场景:工具类
- this的作用?
注意:this只能作用在构造方法和成员方法中
this.属性:调用本对象的成员属性
this.方法:调用本对象的成员方法
this():在构造方法中的第一句调用另外一个构造方法
*/
import java.time.LocalDateTime;
public class User {
private String username;
private String password;
private String name;
private double money;
public User() {
}
public User(String username, String password, String name, double money) {
this.username = username;
this.password = password;
this.name = name;
this.money = money;
}
//设置属性
public void setMoney(double money){
this.money = money;
//额外功能
System.out.println(this.username + "在" + LocalDateTime.now() + "设置了金额:" + this.money);
}
public double getMoney(){
return money;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test02 {
/**
* 知识点:回顾封装
*
* 步骤:
* 1.私有化属性
* 2.添加get(获取)/set(设置)
*
* 好处:
* 属性不能直接调用(存在风向),通过方法调用属性,可以在方法中做额外的功能
*/
public static void main(String[] args) {
User user = new User("1445584980", "123123", "何老师", 2000);
//先获取money属性
//-200
//设置money属性
// user.money = user.money - 200;
// System.out.println(user.money);
user.setMoney(user.getMoney() - 200);
System.out.println(user.getMoney());
}
}
public class Person {
//父类
String name;
char sex;
int age;
public void eat(){
System.out.println(this.name + "吃饭饭");
}
public void sleep(){
System.out.println(this.name + "睡觉觉");
}
}
public class Chinese extends Person{
//子类
String id;
public void playTaiJi(){
System.out.println("中国人:打太极");
}
}
public class Japanese extends Person{
String yearNum;
public void playVideo(){
System.out.println("日本人:拍电影");
}
}
测试类:
public class Test01 {
/**
* 知识点:继承
*
* 理解:
* 子类继承父类所有的属性和方法,但是不能直接调用父类私有化的属性和方法(可以间接调用)
*
* 应用场景:
* 编写多个类时,分析多个类有多个相同的属性或方法,就可以将相同的属性和方法抽取出到父类
*
* 优缺点:
* 优点:减少代码的冗余
* 缺点:降低了代码的可维护性(因为继承会增加类与类之间的关系)
*
* 需求:创建中国人和日本人,以及抽取出父类
* 分析:
* 人类:
* 属性:姓名、性别、年龄
* 方法:吃饭饭、睡觉觉
* 中国人 继承 人类:
* 属性:身份证
* 方法:打太极
* 日本人 继承 人类:
* 属性:年号
* 方法:拍电影
*
*/
public static void main(String[] args) {
Chinese c = new Chinese();
c.name = "徐灿";
c.sex = '男';
c.age = 23;
c.id = "1234567890";
System.out.println(c.name);
System.out.println(c.sex);
System.out.println(c.age);
System.out.println(c.id);
c.eat();
c.sleep();
c.playTaiJi();
System.out.println("-------------------");
Japanese j = new Japanese();
j.name = "波多野结衣";
j.sex = '女';
j.age = 18;
j.yearNum = "令和";
System.out.println(j.name);
System.out.println(j.sex);
System.out.println(j.age);
System.out.println(j.yearNum);
j.eat();
j.sleep();
j.playVideo();
}
}
/**
- 知识点:深入继承
- 1.创建子类对象,会调用父类构造方法吗?
会
- 2.创建子类对象,为什么会调用父类构造方法?
调用父类的构造方法的目的是在子类对象的空间中再划分一个区域用于存放父类的属性
- 3.创建子类对象,先调用父类构造方法还是子类构造方法?
先调用子类构造方法
- 4.创建子类对象,先完成父类构造方法还是子类构造方法?
先完成父类的构造方法
- 5.子类能继承父类所有的属性和方法吗?
可以
子类对象不能直接调用父类的私有化的属性和方法,
但是可以间接调用(调用父类公有的方法,公有的方法中调用私有的属性和方法)
*/
public static void main(String[] args) {
Son son = new Son();
son.fatherAttr = "abc";
System.out.println(son.fatherAttr);
}
}
public class Son extends Father{
//子类
String sonAttr;
public Son() {
super();//默认实现:调用父类的构造方法
System.out.println("子类构造方法");
}
}
public class Father {
String fatherAttr;
public Father() {
System.out.println("父类构造方法");
}
}
/**
- 知识点:super
- 理解:在子类中使用,表示调用父类
super.属性:在子类中,调用父类非私有化的成员属性
super.方法:在子类中,调用父类非私有化的成员方法
super():在子类构造方法的第一句,调用父类非私有化的构造方法
- 需求:创建中国人和日本人,以及抽取出父类
分析:
人类:
属性:姓名、性别、年龄
方法:吃饭饭、睡觉觉
中国人 继承 人类:
属性:身份证
方法:打太极
日本人 继承 人类:
属性:年号
方法:拍电影
- 小结:一个类怎么写?
1.属性
2.私有化属性
3.无参构造
4.有参构造
5.get/set
6.其他方法
*/
public static void main(String[] args) {
Chinese c = new Chinese("徐灿", '男', 23, "1234567890");
c.eat();
c.sleep();
c.playTaiJi();
System.out.println("-------------------");
Japanese j = new Japanese("波多野结衣", '女', 18, "令和");
j.eat();
j.sleep();
j.playVideo();
}
}
//父类
public class Person {
private String name;
private char sex;
private int age;
public Person() {
}
public Person(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println(this.name + "吃饭饭");
}
public void sleep(){
System.out.println(this.name + "睡觉觉");
}
}
//子类
public class Japanese extends Person{
private String yearNum;
public Japanese() {
}
public Japanese(String name,char sex,int age,String yearNum) {
super(name, sex, age);
this.yearNum = yearNum;
}
public String getYearNum() {
return yearNum;
}
public void setYearNum(String yearNum) {
this.yearNum = yearNum;
}
public void playVideo(){
System.out.println(super.getName() + ":拍电影");
}
}
//子类
public class Chinese extends Person{
private String id;
public Chinese() {
}
public Chinese(String name, char sex, int age, String id) {
super(name, sex, age);
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void playTaiJi(){
System.out.println(super.getName() + ":打太极");
}
}
//测试类
public class Test01 {
/**
* 知识点:重写/复写
* 理解:方法与方法之间的关系
* 条件:
* 1.必须有继承关系,重写在子类中
* 2.返回值、方法名、参数列表必须和父类的一样
* 3.访问修饰符不能比父类更加严格
*
* 应用场景:父类方法不满足子类需求时,父类方法在子类中重新写一遍
*
* 需求:创建中国人和日本人,以及抽取出父类
* 分析:
* 人类:
* 属性:姓名、性别、年龄
* 方法:吃饭饭、睡觉觉
* 中国人 继承 人类:
* 属性:身份证
* 方法:打太极
* 日本人 继承 人类:
* 属性:年号
* 方法:拍电影
*/
public static void main(String[] args) {
Chinese c = new Chinese("徐灿", '男', 23, "1234567890");
c.eat();
c.sleep();
c.playTaiJi();
System.out.println("-------------------");
Japanese j = new Japanese("波多野结衣", '女', 18, "令和");
j.eat();
j.sleep();
j.playVideo();
}
}
//父类
public class Person {
private String name;
private char sex;
private int age;
public Person() {
}
public Person(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println(this.name + "吃饭饭");
}
public void sleep(){
System.out.println(this.name + "睡觉觉");
}
}
//子类继承父类
public class Japanese extends Person{
private String yearNum;
public Japanese() {
}
public Japanese(String name,char sex,int age,String yearNum) {
super(name, sex, age);
this.yearNum = yearNum;
}
public String getYearNum() {
return yearNum;
}
public void setYearNum(String yearNum) {
this.yearNum = yearNum;
}
public void playVideo(){
System.out.println(super.getName() + ":拍电影");
}
//重写父类PlayVideo方法
@Override
public void eat() {
System.out.println(super.getName() + "吃马赛克");
}
}
public class Chinese extends Person{
private String id;
public Chinese() {
}
public Chinese(String name, char sex, int age, String id) {
super(name, sex, age);
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void playTaiJi(){
System.out.println(super.getName() + ":打太极");
}
//@Override - 表示重写的注解
//注解:既能向程序员解释代码信息,也能向系统解释代码信息
@Override
public void eat() {
System.out.println(super.getName() + "吃山珍海味");
}
}