一、封装
1.封装是面向对象的三大特征之一(另外两个是继承和多态),他指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,通过该类所提供的方法来实现对内部信息的操作和访问.(区别于对代码重复性问题的循环,和功能重复性的函数)
2.对一个类或对象实现封装,可以实现以下目的:
(1)隐藏类的实现细节.
(2)让使用者只能通过事先预定的方法来访问数据,从而在该方法里加入逻辑控制,限制对成员变量的不合理访问.
(3)可进行数据检查,保证对象信息的完整性.
(4)便于修改,提高代码的可维护性.
3.封装的规则:
(1)将对象的成员变量和实现细节隐藏在起来,不允许外部直接访问.
(2)把方法暴露出来,让方法来控制对成员变量进行安全的访问和操作.
4.访问控制符
(1)private(当前类访问):如果类里的一个成员(包括成员变量,方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问.private用于修饰成员变量最合适,可以把成员变量隐藏在该类的内部.
(2)default(包访问权限):如果类里的一个成员(包括成员变量,方法和构造器)或者一个外部类不使用任何访问修饰符,就称他是 包访问权限.default访问控制的成员或外部类可以被相同包下的其他类访问.
(3)protected(子类访问权限):如果一个成员(包括成员变量,方法和构造器等)使用protected访问控制符来修饰,那么这个成员既可以被同一个包中的其他类访问,也可以被不同包中的子类来访问.一般来说,如果使用protected来修饰一个方法,是希望其子类来重写这个方法.
(4)public(公共访问权限):如果一个成员(包括成员变量,方法和构造器等)或者一个外部类使用public访问控制符来修饰,那么这个成员或外部类就可以被所有类访问,不论访问类和被访问类是否处于同一个包中,是否有父子继承关系.
注:(1)对于局部变量而言,其作用域就是他所在的方法,不能被其他类访问,所以不能用访问修饰符修饰.
(2)对于外部类来说,他只能使用public和默认访问修饰符,不能用protected和private,因为他不在任何类的内部.
(3)外部类可以使用public和包访问控制权限,使用public时可以被所有类使用(声明变量、创建实例等),不使用任何访问控制符修饰的外部类只能被同一个包里的其他类使用.
例子:
public class Person{
private String name;
private int age;
public void setName(String name){
if(name.length()>6||name.length()<2){
Saytem.out.println("人名不符合要求!");
return;
}else{
this.name=name;
}
}
public String getName(){
return this.name;
}
public void setAge(int age){
if(age>100||age<0){
System.out.println("年龄不合法!");
return;
}else{
this.age=age;
}
}
public int getAge(){
return this.age;
}
}
二、继承
1.java的继承通过关键字extends实现,实现继承的类被称为子类,被继承的类为父类,语法如下:
修饰符 class SubClass extends SuperClass{
类定义部分
}
例子:
public class Fruit{
public double weight;
public void info(){
System.out.println("水果重"+weight+"g!");
}
}
public class Apple extends Fruit{
public static void main(String[] args){
Apple a=newApple();
a.weight=56;
a.info();
}
}
注:类与类之间是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类.
在Java里面我们会有一个最终的父类是Object类 是任何一个类的最终父类.
2.接口
由来:如果一个抽象类中所有的方法都是抽象的,那么这个抽象类就可以用接口去表述,接口就是一个特殊的抽象类.
功能:(1)为类添加功能(2)作为一种中间传递
类与接口之间多实现关系:给类多加功能
接口与接口之间多继承关系:只保留函数声明,并未指定具体执行,所以不会产生二义性.
3.implements关键字
implements 关键字的使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔).
例子:
public interface A {
public void drink();
public void eat();
}
public interface B {
public void show();
}
public class C implements A,B {
}
三、LeetCode1266讲解
题目:平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi]。请你计算访问所有这些点需要的最小时间(以秒为单位)。
你可以按照下面的规则在平面上移动:
(1)每一秒沿水平或者竖直方向移动一个单位长度,或者跨过对角线(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。
(2)必须按照数组中出现的顺序来访问这些点。
讲解:理解题意可知x轴或者y轴的最远距离即为需要的步数(points = [[1,1],[3,4],[-1,0]],[1,1] 到 [3,4] 比较两个x和y差值(2和3)的最大值为3,所以需要 3 秒 ,从 [3,4] 到 [-1,0]比较两个x和y差值(4和4)的最大值为4,所以需要 4 秒.),不用考虑斜线因为x轴与y轴方向可以同时移动只计一步也就是走斜线也算一步.
代码:
class Solution {
public int minTimeToVisitAllPoints(int[][] points) {
int time=0;
for(int i=1;i<points.length;i++){//遍历数组
int x=Math.abs(points[i][0]-points[i-1][0]);//两个点横坐标的差值
int y=Math.abs(points[i][1]-points[i-1][1]);//两个点纵坐标的差值
int z=x>y?x:y;//比较x和y的最大值
time+=z;
}
return time;
}
}