Java 封装、继承、final、super、覆写

目录

1.封装

1.1package

1.2 import

1.3 权限控制

 2.继承

2.1是什么

2.2能做什么

2.3怎么用

3.super

3.1是什么

3.2能做什么

3.3怎么用

3.4注意

4. 覆写

4.1 是什么

4.2应用场景

5.final 

5.1是什么

5.2能做什么

5.3怎么用

5.4深入final


 

1.封装

封装(计算机程序术语)

  封装,即隐藏对象的属性和是实现细节,仅对外公开接口,控制在程序中的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员。

1.1package

package: 软件包机制

     限制的是编译之后的class文件的保存目录,和源文件无关

     eclipse中,源文件也必须在这个目录中,这是eclipse的问题,和package无关

     而Java中的package只是规定class文件

   1. 主要解决命名冲突问题

   2. package语句必须出现在Java源文件的第一行

   3. 一般采用公司域名倒叙的方式

    com.tkedu.oa.syatem;

    com.tledu.oa.pojo;

    com.tledu.oa.dto;

   域名倒叙.项目名.模块名

  4. 带有package语句的Java文件 应该是这样编译的

   Javac -d 生成路径  字符编码 源文件路径

   javac -d./-encofing  utf-8 xxx.java

   -d: disk 磁盘

   ./ :代表当前目录

   5. 运行

       Java 包名.类名

package day_03._01_Package;

1.2 import

package Package;
/**
 * import 
 *  调用不是本包的类
 * @author 人间失格
 * @data     2021年10月13日下午7:55:33
 */
public class Package_02 {

	public static void main(String[] args) {
		//调用一个不是本包中的类,需要写类全名
		//包名.类名
		day_03._01_Package.com.User user =new day_03._01_Package.com.User();
		user.m1();
	}

}

package Package;
//导入对应的这个类
//.* 是导入对应包下的所有类
import java.util.*;
import day_03._01_Package.com.User;
//java.lang.*; 下的所有类,为系统核心类,可以直接使用,不需要导入
/**
 * import 用于导入当前类中需要用到的其他类
 * 该语句 必须在package语句之下, class语句之上
 * @author 人间失格
 * @data     2021年10月13日下午8:19:47
 */
public class Package_03 {

	public static void main(String[] args) {
		String str = "xxx";
		//调用一个不是本包中的类,需要写类的全名
		//包名.类名
		/**
		 * 注意: 写代码的时候,使用eclipse空格 会自动导入对应的包
		 * 
		 * 如果程序没有问题,但是报错,可以查看一下,是否是导包错误了
		 */
		User user = new User();
		user.m1();
	}

}

package Package;
//静态导入,访问一个类的静态属性的时候,需要使用类名,静态属性访问
//但是静态导入后,就可以直接写静态属性访问
import static day_03._01_Package.com.User.*;
import day_03._01_Package.com.User;

public class Package_04 {

	public static void main(String[] args) {
		       // 类名.静态变量名
				System.out.println(User.a);
				// 因为静态导入了,所以可以直接写变量名
				// 不建议使用,在当前类中,不容易看出来,这个变量到底是谁的
				System.out.println(a);
	}

}

1.3 权限控制

package day_03._02_PPP.pojo;

public class User {
	// public : 哪都行共有的
	public static int a = 1;
	// private : 除了当前类,那都不行 私有的
	private static int b = 2;
	// 默认 是包权限,同包可以访问 
	static int c = 3;
	// 继承权限,要么同包,要么有继承关系
	protected static int d = 4;
}
package PPP;
import day_03._02_PPP.pojo.User;
public class PPP_01 {

	public static void main(String[] args) {
		System.out.println(User.a);
//		System.out.println(User.b); 私有访问不了
//		System.out.println(User.c);  静态默认不能访问
//		System.out.println(User.d);继承权限,要么同包,要么有继承关系
        System.out.println(A.a);
//        System.out.println(A.b); 私有不能访问
        System.out.println(A.c);
        System.out.println(A.d);

	}

}

 2.继承

2.1是什么

1. 继承 

   继承就是在已有类中派生出新的类,新的类能够吸收父类已有的属性和行为,并且还能扩展自己的属性和行为

2. 继承的特点

Java中 只支持单继承, 不支持多继承, 这样可以使java的继承体系更加简单清晰

        一个类中只能有一个父类, 但是一个类可以有很多的子类

继承关系是可以传递的

private私有化属性是不能被继承的

2.2能做什么

3. 解决什么问题

  提高代码的复用 ,提高开发的效率

  一个类如果没有显示继承另一个类那么该类就默认继承object

  java.lang.object, 是java提供的跟类(祖宗),也就意味着 object中的属性是所有类都有的

2.3怎么用

语法:   [修饰符] class 类名 extends 父类名{

            类体;

}

package Extends;
/**
 * 1 继承 : 
 *   继承 就是在已有类中派生出新的类,新的类能够吸收父类已有的属性和行为,并且还能扩展自己的属性和行为
 *   
 *  2 继承特点
 *    java中 只支持单继承,不支持多继承 ,这样使java 的继承体系更加简单清晰
 *    		一个类只能有一个父类,但是一个类可以有很多子类
 *    继承关系是可以进行传递的
 *    
 *    private私有化属性不能被继承
 * 
 * 	3 解决什么问题?
 * 		提高 代码的复用,提高开发效率
 * 
 * 一个类如果没有显示继承另一个类,那么该类默认继承 Object
 * 		java.lang.Object ,是java提供的根类(祖宗) ,也就意味着 Object中的所有属性是所有类都有的
 * 
 * 4 怎么用
 * 		语法  [修饰符] class(子类) 类名 extends 父类名{
 * 				类体;
 * 		}
 * @author 人间失格
 * @data     2021年10月13日下午8:51:16
 */

public class Extends_01 {

	public static void main(String[] args) {
		SubClass subClass =new SubClass();
		//调用继承来自父类的方法
		subClass.m1();
		//调用自己的方法
		subClass.m2();
		//因为所有的类都直接间接继承object,而tostring就是ibject的方法
		subClass.toString();
	}

}

3.super

3.1是什么

 super : 官方说法是,代表了父类型特征,也可以理解为父类对象

  通过子类中,可以使用super关键之,来标识父类,通过this来标识自己

3.2能做什么

   1. 不能在静态上下文中使用

   2. 用在构造方法或者成员方法中,区分子类和父类同名的变量和方法

      super.xxx =xxx;  或者 super.m1();

   3. 用在子类构造方法中,调用弗雷德构造方法

      super(参数) : 必须出现在子类构造方法第一行

      this(参数) : 也必须出现在第一行, 所以 他们两个不能同时出现

如果构造方法第一行,没有 出现 this (参数) 也没有出现 super(参数)

则默认有个super() 调用弗雷德无参构造

3.3怎么用

package Super;

public class SupClass {
	int i = 1;
	public void m1(){
		System.out.println("父类m1");
	}
	public SupClass(){
		super();
		System.out.println("父类构造");
	}
	public SupClass(int i){
		super();
		System.out.println("父类构造"+i);
	}
}

package Super;

public class SubClass extends SupClass {
	int i =2;
	public void m1(){
	System.out.println("子类m1");
	}
	public void test (){
		//由于子类也有,所以默认使用子类的
		System.out.println(i);
		//想要使用父类,需要使用super区分
		System.out.println(super.i);
		m1();
		super.m1();
	}
    public SubClass(){
    	super(22);
    	System.out.println("子类构造");
    }
	

}
package Super;
/**
 * super : 官方给的说法是,代表了父类型特征,可以理解为父类对象
 * 		通过子类中,可以使用super关键字,来标识父类,通过this来标识自己
 * 
 * 1 不能再静态上下文中使用
 * 2 用在构造方法或者成员方法中 ,区分子类和父类同名的变量和方法
 * 		super.xxx = xxx;  super.m1();
 * 3 用在子类构造方法中,调用父类的构造方法
 * 			super(参数);   必须出现在子类构造方法第一行
 * 			this(参数) : 也必须出现在第一行,所以 他们两个不能同时出现
 * 		如果 构造方法第一行 , 没有出现 this(参数) 也没有出现 super(参数)  
 * 			则默认有个super()  调用父类的无参构造
 * @author 人间失格
 * @data     2021年10月13日下午9:13:08
 */
public class Super_01 {

	public static void main(String[] args) {
		SubClass sub = new SubClass();
		sub.test();
	}

}

3.4注意

1. this() 和super() 不能同时出现

2. 如果没有 this() 和super() ,默认构造方法第一行会有super() 调用父类无参构造

3. 如果构造方法私有化,则该类不能被继承

package Super;

public class Super_02 {
	private Super_02(){
		
	}
}
// 构造方法私有化之后,不能被继承,因为子类构造方法中,需要调用父类构造方法
// 但是因为私有化的问题,导致子类调用不了
//class Test extends Super_02{
//	
//}

4. 覆写

4.1 是什么

override : 方法的覆写/重写

 什么时候需要重写: 当父类功能无法满足子类需求的时候,子类需要根据需求对方法进行重写

 方法 覆写 特指成员方法,只有成员方法可以被覆写,和静态方法,静态变量,成员变量都没有关系

4.2应用场景

 什么时候需要重写: 当父类功能无法满足子类需求的时候,子类需要根据需求对方法进行重写

重写的必要条件:

1.必须有继承关系的体系中

2. 方法名必须一致,方法名不同,就是两个方法了,跟重写没有关系

3.参数列表必须一致,如果参数列表不一致,就是方法的重载(overload)

4. 返回值必须一致,返回值表示反馈的功能,不能更改功能

5. 不能比原方法有更宽泛的异常(错误不能越来越多)

6. 不能比原方法拥有更低的访问权限

重写的意义:
功能越来越强

错误越来越少

使用范围越来越广

覆写(override)和重载(overload)

package Override;

public class Override_01 {
	public static void main(String[] args) {
		//创建对象
		Cat c = new Cat();
		//调用对象
		c.move();
	}
}
//创建类 类名Animal
class Animal{
	public void move(){
		System.out.println("动物移动");
	}
}
//继承 子类cat父类Animal
class Cat extends Animal{
	// @Override注解 标识该方法是覆写的父类的方法
	// 如果加着该注解,方法如果不小心写错了,比如方法名拼写错误的时候,会提示有错
	@Override
	//满足不了子类的功能需求覆写他
	public void move() {
		System.out.println("猫............在爬");
	}
	}

5.final 

5.1是什么

final 是修饰符 表示最后的 ,最终的,不可以更改

5.2能做什么

final 修饰的类 不能被继承

final 修饰的方法,不能被覆写

final 修饰的变量,不能二次赋值,并且没有默认值

final 修饰的静态变量 ,一般叫常量, 一般使用 public static final 修饰 ,常量名建议全部大写

5.3怎么用

 

 

 常量

5.4深入final

package Final;
/**
 * 深入final : final 修饰的引用类型,地址不能更改, 和地址对因对应的数据,没有关系
 * @author 人间失格
 * @data     2021年10月13日下午10:02:23
 */
public class Final_02 {

		public static void main(String[] args) {
			final int i = 1;
			// i = 2;

			final Customer c = new Customer("张三", 18);
			// c中保存的地址,根据地址找到的数据是可以更改的,因为name又没有加final修饰
			c.name = "李四";
			// 因为c使用final修饰了,所以c不能再更改为其他值
			// c = null;
			// c = new Customer("张三", 18);
			System.out.println(c.name);
			System.out.println(c.age);
		}
	}

	class Customer {
		String name;
		int age;

		public Customer(String name, int age) {
			super();
			this.name = name;
			this.age = age;
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Iiversse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值