封装
什么是封装?
封装是面向对象的三大特性之一,它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对信息的操作和访问。
封装:私有属性,公有方法
封装的好处
- 隐藏类的实现细节;
- 让使用者只能通过预先的方法来访问数据,从而可以在该方法中加入逻辑控制,限制对成员变量不合理的访问;
- 可进行数据检查,从而有利保证对象的完整性。
- 便与修改提高代码的可维护性;
-
安全性较高
实际上封装的两个含义是:把该隐藏的隐藏起来,把该暴露的暴露出来。这两个方面都可以通过java提供访问控制符来实现。
访问控制符
java提供了三个访问控制符:private、protected、public,另外还有不加控制符的访问控制级别。
级别排序:private>default>protected>public级别由小到大
。
实例:隐藏属性---只能在类的内部使用,而对象不能直接使用。但是可以通过设定设置私有属性的方法和获取私有属性的方法来使用私有属性。
通过快捷键来定以方法set和get;点击右键:
这样可以快捷的定义方法。
关于访问控制符的使用,存在如下几条基本原则:
- 类里面绝大部分成员变量都应该使用private修饰,只有一些static修饰的,类似于全局变量的成员变量,才可以考虑使用public修饰。除此之外,有些方法只用于辅助实现该类的其他方法,被称为工具方法,这种也可以用private修饰;
- 如果某个类主要用做其他类的父类,该类里包含的大部分方法可能仅希望被其子类重写,而不想被外界调用,则应该适用protected修饰这些方法。
- 大部分外部类都是用public修饰。
- 安全性较高
代码块
什么是代码块?
在Java中,使用{}括起来的代码被称为代码块。
代码块分类
根据其位置和声明的不同可以分为:
- 局部代码块:在方法中出现,限定变量生命周期,随着方法的调用而调用,销毁而销毁,及早释放,提高内存利用率。
public class CodeStock {
public static void main(String[] args) {
int num=100;
{
System.out.println(num);
num=10;
}
System.out.println(num);
}
}
- 构造代码块:在类中方法外出现,多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行。
public class Student {
String name;
public Student(){
System.out.println("我是构造方法");
}
{
System.out.println("我是构造代码块");
}
public static void main(String[] args) {
Student student = new Student();
}
}
/*我是构造代码块
我是构造方法*/
- 静态代码块:在类中方法外出现,加static修饰,用于给类进行初始化,在加载类的时候执行一次。
public class Student {
String name;
public Student(){
System.out.println("我是构造方法");
}
{
System.out.println("我是构造代码块");
}
static {
System.out.println("我是静态代码块");
}
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student();
}
}
/*我是静态代码块
我是构造代码块
我是构造方法
我是构造代码块
我是构造方法*/
继承
什么是继承?
继承是面向对象的三大特征之一,多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。也就是在一个类的基础上产生一个新类的过程叫继承。
如何实现继承?
通过extends关键字可以实现类的继承;
格式:class 子类名 extends 父类名{}
实现继承的类称为子类,被继承的类称为父类,有的也称为基类、超类。
对继承的理解:
父类和子类的关系一般与特殊,抽象与具体,广义和狭义的关系。比如父类为动物类,是一个抽象的概念,子类继承父类所以子类可以是猫类,狗类,老虎类等,是将抽象的动物类具体到哪类动物。
如果想实现多层继承,比如Tom这个猫还要继承猫类,则Tom可以称为动物类的子孙类,动物类称为Tom类的祖先类。
实例(以上面说的为例):
Animal.class
public class Animal {
//给出默认值Tom
String name=“Tom”;
int age;
public void eat(){
System.out.println("动物喜欢吃饭");
}
}
Cat.class
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫喜欢吃鱼");
}
}
Tom.class
public class Tom extends Cat {
@Override
public void eat() {
System.out.println(this.name+"喜欢吃带鱼");
}
}
Test01.class测试类
public class Test01 {
public static void main(String[] args) {
Animal animal = new Animal();
Cat cat = new Cat();
Tom tom = new Tom();
animal.eat();
cat.eat();
tom.eat();
}
}
/*动物喜欢吃饭
猫喜欢吃鱼
Tom喜欢吃带鱼*/
可以从上面的代码中体会到多层继承将类的范围越来越具体到实例。并且在Tom类中用自身的对象可以访问到其祖先类的name属性,而在Tom中并没有定义name属性。
继承的优缺点
- 优点:提高了代码的复用性;提高了代码的维护性;让类与类之间产生了关系,多态的前提;
- 缺点:类的耦合性增强了;而开发的原则是高内聚,低耦合,大概意思是尽量降低类与类之间的依赖关系,增强类内部实现事物的能力。
继承的特点
- java只支持单继承,不支持多继承,换句话说就是子类只能有一个父类而不能继承多个父类;
- java实现多层继承:比如上述实例中有双层继承,即Cat继承Anaimal,Tom继承Cat,这种就叫做多层继承。
继承的注意事项
-
子类继承父类的非私有的属性和方法
-
子类可以扩展自己的属性和方法
-
子类不能继承父类的构造器,只能通过super关键字调用
-
可以声明父类,创建子类()
- 声明什么类型,就可以调用本类的属性和方法
- 创建什么类型,就可以运行该类型的属性和方法
- 创建什么类型,就可以强转为什么类型
- 不要为了部分功能而去继承;