Day10-面向对象(3)


一、static(下)

  1. 修饰方法:类方法/静态方法,直接用类名调用

    应用场景:工具类

    注意:该类只是纯粹的功能,就可以把该类变为工具类,直接用类名调用静态方法即可

  1. 静态代码块:

    应用场景:初始化数据(功能和构造方法类似)
    构造方法 vs 代码块 vs 静态代码块

构造方法:创建对象时调用,初始化数据(成员变量、静态变量)

代码块:创建对象时优先于构造方法调用,初始化数据(成员变量、静态变量)

静态代码块:字节码文件加载到方法区时调用,初始化数据(静态变量
A类

package com.dream.test02;

public class A {
	
	
	//构造方法在创建对象时被调用
	public A() {
		System.out.println("A类的无参构造");
	}
	
	//代码块在创建对象时优先于构造方法被调用
	{
		System.out.println("A类的代码块");
	}
	
	//静态代码块在A.class加载到方法区时被调用
	static{
		System.out.println("A类的静态代码块");
	}

}

测试类

package com.dream.test02;

public class Test01 {

	public static void main(String[] args) {
		/**
		 * 静态代码块
		 */
		
		A a1 = new A();
		A a2 = new A();
		
		
	}
}

二、继承

含义:子类继承父类的属性和方法

语法:public class 子类 extends 父类{}

注意:一个类只能继承另一个类(单继承)

好处:减少代码的冗余

应用场景:多个类,拥有相同的属性和方法,就可以把这些相同的属性和方法抽取到父类中

人类

package com.dream.test03;

public class Person {
	
	String name;
	char sex;
	int age;
	
	public void eat(){
		System.out.println("吃饭饭");
	}
	
	public void sleep(){
		System.out.println("睡觉觉");
	}

}

中国人类

package com.dream.test03;

//			 子类		  继承		  父类
public class Chinese extends Person{

	String chineseId;
	
	public void playTaiJi(){
		System.out.println("打太极");
	}
}

日本人类

package com.dream.test03;

public class Japanese extends Person{

	String japaneseId;
	
	public void playVedio(){
		System.out.println("拍电影");
	}
}

测试类

package com.dream.test03;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * 继承
		 * 
		 * 需求:编写中国人和日本人
		 * 分析:
		 * 	人类:属性:姓名、年龄、性别	方法:吃饭饭、睡觉觉
		 * 	中国人类:属性-chineseId	方法:打太极
		 * 	日本人类:属性-japaneseId	方法:拍电影
		 */
		
		Chinese c = new Chinese();
		c.name = "杨晨";
		c.sex = '男';
		c.age = 18;
		System.out.println(c.name);
		System.out.println(c.sex);
		System.out.println(c.age);
		c.eat();
		c.sleep();
		c.chineseId = "123456789";
		System.out.println(c.chineseId);
		c.playTaiJi();
		
		Japanese j = new Japanese();
		j.name = "麻生希";
		j.sex = '女';
		j.age = 23;
		System.out.println(j.name);
		System.out.println(j.sex);
		System.out.println(j.age);
		j.eat();
		j.sleep();
		j.japaneseId = "987654321";
		System.out.println(j.japaneseId);
		j.playVedio();
		
	}

}

三、深入继承

  1. 子类可以继承父类的私有化属性和方法吗?

    可以的

  2. 创建子类对象,会调用父类构造方法吗?

  3. 创建子类对象,调用父类构造方法的目的?

    在子类对象中开辟空间,用于存储父类的属性

  4. 创建子类对象,会创建父类对象吗?

    不会

  5. 创建子类对象,先调用父类构造方法还是子类构造方法?

    先调用子类构造方法

人类

package com.dream.test04;

public class Person {
	
	private String name;
	private char sex;
	private int age;
	
	public Person() {
		System.out.println("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("吃饭饭");
	}
	
	public void sleep(){
		System.out.println("睡觉觉");
	}
	
	private void fatherMethod01(){
		System.out.println("父类私有化方法");
	}
	
	public void fatherMethod02(){
		fatherMethod01();
	}

}

中国人类

package com.dream.test04;

//			 子类		  继承		  父类
public class Chinese extends Person{

	String chineseId;
	
	public Chinese() {
		//super();//默认实现调用父类的无参构造
		System.out.println("Chinese类的构造方法");
	}
	
	public void playTaiJi(){
		System.out.println("打太极");
	}
}

日本人类

package com.dream.test04;

public class Japanese extends Person{

	String japaneseId;
	
	public Japanese() {
	}
	
	public void playVedio(){
		System.out.println("拍电影");
	}
}

测试类

package com.dream.test04;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * 深入继承
		 * 
		 * 1.子类可以继承父类的私有化属性和方法吗?
		 * 	可以继承,但是不可以直接调用
		 * 
		 * 2.创建子类对象,会调用父类构造方法吗?
		 * 	会
		 * 
		 * 3.创建子类对象,调用父类构造方法的目的?
		 *  在子类对象中开辟空间,用于存储父类的属性
		 *  
		 * 4.创建子类对象,会创建父类对象吗?
		 *  不会
		 *  
		 * 5.创建子类对象,先调用父类构造方法还是子类构造方法?
		 *  先调用子类构造方法
		 *  
		 * 6.创建子类对象,先完成父类构造方法还是子类构造方法? 
		 * 	先完成父类构造方法
		 * 
		 */
		
		Chinese c = new Chinese();
		c.setName("杨晨");
		System.out.println(c.getName());
		
		c.fatherMethod02();
	}

}

四、super

含义:父类

作用:

  1. super.属性:在子类中,调用父类非私有化属性

  2. super.方法:在子类中,调用父类非私有化方法

  3. super():在子类中,调用父类非私有化构造方法
    人类

package com.dream.test05;

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 + "睡觉觉");
	}
	
}

中国人类

package com.dream.test05;

public class Chinese extends Person{

	private String chineseId;
	
	public Chinese() {
	}
	
	public Chinese(String chineseId) {
		this.chineseId = chineseId;
	}
	
	public Chinese(String name,char sex,int age,String chineseId){
		//调用父类的非私有化构造方法
		super(name, sex, age);
		this.chineseId = chineseId;
	}

	public void playTaiJi(){
		//调用父类的非私有化方法
		System.out.println(super.getName() + "打太极");
	}
}

日本人类

package com.dream.test05;

public class Japanese extends Person{

	private String japaneseId;
	
	public Japanese() {
	}
	
	public Japanese(String name, char sex, int age, String japaneseId) {
		super(name, sex, age);
		this.japaneseId = japaneseId;
	}

	public void playVedio(){
		System.out.println(super.getName() + "拍电影");
	}
}

测试类

package com.dream.test05;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * super
		 * 
		 */
		
		Chinese c = new Chinese("大牛", '男', 18, "123456789");
		
		c.eat();
		c.playTaiJi();
		
	}

}

五、重写

含义:将父类里的方法,在子类中重新写一遍

应用场景:父类方法不满足子类需求时,考虑使用重写

条件:

  1. 在子类中

  2. 返回值、方法名、参数列表必须和父类重写的方法一致

  3. 访问修饰符不能比父类更严格

人类

package com.dream.test06;

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 + "睡觉觉");
	}
	
}

中国人类

package com.dream.test06;

public class Chinese extends Person{

	private String chineseId;
	
	public Chinese() {
	}

	public Chinese(String name, char sex, int age, String chineseId) {
		super(name, sex, age);
		this.chineseId = chineseId;
	}

	public String getChineseId() {
		return chineseId;
	}

	public void setChineseId(String chineseId) {
		this.chineseId = chineseId;
	}
	
	public void playTaiJi(){
		System.out.println(super.getName() + "打太极");
	}
	
	//@Override注解:重写
	//注释:给程序员解释的
	//注解:既给程序员解释,也给程序解释
	@Override
	public void eat() {
		System.out.println(super.getName() + "吃山珍海味");
	}
}

日本人类

package com.dream.test06;

public class Japanese extends Person{

	private String japaneseId;
	
	public Japanese() {
	}

	public Japanese(String name, char sex, int age, String japaneseId) {
		super(name, sex, age);
		this.japaneseId = japaneseId;
	}

	public String getJapaneseId() {
		return japaneseId;
	}

	public void setJapaneseId(String japaneseId) {
		this.japaneseId = japaneseId;
	}
	
	public void playVedio(){
		System.out.println(super.getName() + "拍电影");
	}
	
	@Override
	public void eat() {
		System.out.println(super.getName() + "吃马赛克");
	}
}

测试类

package com.dream.test06;

public class Test01 {
	
	public static void main(String[] args) {
		/**
		 * 重写:
		 * 
		 * 需求:编写中国人和日本人
		 * 
		 * 含义:方法与方法之间的关系
		 * 条件:
		 * 	1.重写的位置是在子类中
		 * 	2.返回值类型、方法名、参数列表必须和父类重写的方法一致
		 *  3.访问修饰符不能比父类更要严格
		 *  
		 * 应用场景:父类里的方法不能改变时,并且父类的方法不满足子类需求时,在子类重写父类的方法
		 * 
		 */
		
		Chinese c = new Chinese("杨晨", '男', 18, "123456789");
		c.eat();
		
		Japanese j = new Japanese("波多野结衣", '女', 23, "987654321");
		j.eat();
	}

}

六、访问修饰符

访问修饰符本类本包同包子类不同包不同包子类
privateok
default(默认权限)okokok
protectedokokokok
publicokokokokok
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Helloword先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值