封装

封装的哲学思维:合理隐藏,合理暴露

封装最初的目的:提高代码的安全性和复用性,组件化

封装的步骤:

  1. 成员变量应该私有,用 private 修饰,只能在本类中直接访问
  2. 提供成套的 getter 和 setter 方法暴露成员变量的取值和赋值

使用 private 修饰成员变量的原因:实现数据封装,不想让别人使用修改你的数据,比较安全


this

this 关键字的作用:

  • this 关键字代表了当前对象的引用
  • this 出现在方法中:哪个对象调用这个方法 this 就代表谁
  • this 可以出现在构造器中:代表构造器正在初始化的那个对象
  • this 可以区分变量是访问的成员变量还是局部变量

static

基本介绍

Java 是通过成员变量是否有 static 修饰来区分是类的还是属于对象的

按照有无 static 修饰,成员变量和方法可以分为:

  • 成员变量:

    • 静态成员变量(类变量):static 修饰的成员变量,属于类本身,与类一起加载一次,只有一个,直接用类名访问即可
    • 实例成员变量:无 static 修饰的成员变量,属于类的每个对象的,与类的对象一起加载,对象有多少个,实例成员变量就加载多少个,必须用类的对象来访问
  • 成员方法:

    • 静态方法:有 static 修饰的成员方法称为静态方法也叫类方法,属于类本身的,直接用类名访问即可
    • 实例方法:无 static 修饰的成员方法称为实例方法,属于类的每个对象的,必须用类的对象来访问

static 用法

成员变量的访问语法:

  • 静态成员变量:只有一份可以被类和类的对象共享访问

    • 类名.静态成员变量(同一个类中访问静态成员变量可以省略类名不写)
    • 对象.静态成员变量(不推荐)
  • 实例成员变量:

    • 对象.实例成员变量(先创建对象)

成员方法的访问语法:

  • 静态方法:有 static 修饰,属于类

    • 类名.静态方法(同一个类中访问静态成员可以省略类名不写)
    • 对象.静态方法(不推荐,参考 JVM → 运行机制 → 方法调用)
  • 实例方法:无 static 修饰,属于对象

    • 对象.实例方法
    public class Student {// 1.静态方法:有static修饰,属于类,直接用类名访问即可!public static void inAddr(){ }// 2.实例方法:无static修饰,属于对象,必须用对象访问!public void eat(){}public static void main(String[] args) {// a.类名.静态方法Student.inAddr();inAddr();// b.对象.实例方法// Student.eat(); // 报错了!Student sea = new Student();sea.eat();}
    }
    

两个问题

内存问题:

  • 栈内存存放 main 方法和地址

  • 堆内存存放对象和变量

  • 方法区存放 class 和静态变量(jdk8 以后移入堆)

访问问题:

  • 实例方法是否可以直接访问实例成员变量?可以,因为它们都属于对象
  • 实例方法是否可以直接访问静态成员变量?可以,静态成员变量可以被共享访问
  • 实例方法是否可以直接访问实例方法? 可以,实例方法和实例方法都属于对象
  • 实例方法是否可以直接访问静态方法?可以,静态方法可以被共享访问
  • 静态方法是否可以直接访问实例变量? 不可以,实例变量必须用对象访问!!
  • 静态方法是否可以直接访问静态变量? 可以,静态成员变量可以被共享访问。
  • 静态方法是否可以直接访问实例方法? 不可以,实例方法必须用对象访问!!
  • 静态方法是否可以直接访问静态方法?可以,静态方法可以被共享访问!!

继承

基本介绍

继承是 Java 中一般到特殊的关系,是一种子类到父类的关系

  • 被继承的类称为:父类/超类
  • 继承父类的类称为:子类

继承的作用:

  • 提高代码的复用,相同代码可以定义在父类中
  • 子类继承父类,可以直接使用父类这些代码(相同代码重复利用)
  • 子类得到父类的属性(成员变量)和行为(方法),还可以定义自己的功能,子类更强大

继承的特点:

  1. 子类的全部构造器默认先访问父类的无参数构造器,再执行自己的构造器
  2. 单继承:一个类只能继承一个直接父类
  3. 多层继承:一个类可以间接继承多个父类(家谱)
  4. 一个类可以有多个子类
  5. 一个类要么默认继承了 Object 类,要么间接继承了 Object 类,Object 类是 Java 中的祖宗类

继承的格式:

子类 extends 父类{}

子类不能继承父类的东西:

  • 子类不能继承父类的构造器,子类有自己的构造器
  • 子类是不能可以继承父类的私有成员的,可以反射暴力去访问继承自父类的私有成员
  • 子类是不能继承父类的静态成员,父类静态成员只有一份可以被子类共享访问,共享并非继承
public class ExtendsDemo {public static void main(String[] args) {Cat c = new Cat();// c.run();Cat.test();System.out.println(Cat.schoolName);}
}class Cat extends Animal{}class Animal{public static String schoolName ="seazean";public static void test(){}private void run(){}
}

变量访问

继承后成员变量的访问特点:就近原则,子类有找子类,子类没有找父类,父类没有就报错

如果要申明访问父类的成员变量可以使用:super.父类成员变量,super指父类引用

public class ExtendsDemo {public static void wmain(String[] args) {Wolf w = new Wolf();ww.showName();}
}class Wolf extends Animal{private String name = "子类狼";public void showName(){String name = "局部名称";System.out.println(name); // 局部nameSystem.out.println(this.name); // 子类对象的nameSystem.out.println(super.name); // 父类的System.out.println(name1); // 父类的//System.out.println(name2); // 报错。子类父类都没有}
}class Animal{public String name = "父类动物名称";public String name1 = "父类";
}

方法访问

子类继承了父类就得到了父类的方法,可以直接调用,受权限修饰符的限制,也可以重写方法

方法重写:子类重写一个与父类申明一样的方法来覆盖父类的该方法

方法重写的校验注解:@Override

  • 方法加了这个注解,那就必须是成功重写父类的方法,否则报错
  • @Override 优势:可读性好,安全,优雅

子类可以扩展父类的功能,但不能改变父类原有的功能,重写有以下三个限制:

  • 子类方法的访问权限必须大于等于父类方法
  • 子类方法的返回类型必须是父类方法返回类型或为其子类型
  • 子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型

继承中的隐藏问题:

  • 子类和父类方法都是静态的,那么子类中的方法会隐藏父类中的方法
  • 在子类中可以定义和父类成员变量同名的成员变量,此时子类的成员变量隐藏了父类的成员变量,在创建对象为对象分配内存的过程中,隐藏变量依然会被分配内存
public class ExtendsDemo {public static void main(String[] args) {Wolf w = new Wolf();w.run();}
}
class Wolf extends Animal{@Overridepublic void run(){}//
}
class Animal{public void run(){}
}

常见问题

  • 为什么子类构造器会先调用父类构造器?

    1. 子类的构造器的第一行默认 super() 调用父类的无参数构造器,写不写都存在
    2. 子类继承父类,子类就得到了父类的属性和行为。调用子类构造器初始化子类对象数据时,必须先调用父类构造器初始化继承自父类的属性和行为
    3. 参考 JVM → 类加载 → 对象创建
    class Animal {public Animal() {System.out.println("==父类Animal的无参数构造器==");}
    }class Tiger extends Animal {public Tiger() {super(); // 默认存在的,根据参数去匹配调用父类的构造器。System.out.println("==子类Tiger的无参数构造器==");}public Tiger(String name) {//super();  默认存在的,根据参数去匹配调用父类的构造器。System.out.println("==子类Tiger的有参数构造器==");}
    }
    
  • 为什么 Java 是单继承的?

    答:反证法,假如 Java 可以多继承,请看如下代码:

    class A{public void test(){System.out.println("A");}
    }
    class B{public void test(){System.out.println("B");}
    }
    class C extends A , B {public static void main(String[] args){C c = new C();c.test(); // 出现了类的二义性!所以Java不能多继承!!}
    }
    

super

继承后 super 调用父类构造器,父类构造器初始化继承自父类的数据。

总结与拓展:

  • this 代表了当前对象的引用(继承中指代子类对象):this.子类成员变量、this.子类成员方法、this(…) 可以根据参数匹配访问本类其他构造器
  • super 代表了父类对象的引用(继承中指代了父类对象空间):super.父类成员变量、super.父类的成员方法、super(…) 可以根据参数匹配访问父类的构造器

注意:

  • this(…) 借用本类其他构造器,super(…) 调用父类的构造器
  • this(…) 或 super(…) 必须放在构造器的第一行,否则报错
  • this(…) 和 super(…) 不能同时出现在构造器中,因为构造函数必须出现在第一行上,只能选择一个
public class ThisDemo {public static void main(String[] args) {// 需求:希望如果不写学校默认就是”张三“!Student s1 = new Student("天蓬元帅", 1000 );Student s2 = new Student("齐天大圣", 2000, "清华大学" );}
}
class Study extends Student {public Study(String name, int age, String schoolName) {super(name , age , schoolName) ; // 根据参数匹配调用父类构造器 }
}class Student{private String name ;private int age ;private String schoolName ;public Student() {}public Student(String name , int age){// 借用兄弟构造器的功能!this(name , age , "张三");}public Student(String name, int age, String schoolName) {this.name = name;this.age = age;this.schoolName = schoolName;}// .......get + set
}

final

基本介绍

final 用于修饰:类,方法,变量

  • final 修饰类,类不能被继承了,类中的方法和变量可以使用
  • final 可以修饰方法,方法就不能被重写
  • final 修饰变量总规则:变量有且仅能被赋值一次

final 和 abstract 的关系是互斥关系,不能同时修饰类或者同时修饰方法


修饰变量

静态变量

final 修饰静态成员变量,变量变成了常量

常量:有 public static final 修饰,名称字母全部大写,多个单词用下划线连接

final 修饰静态成员变量可以在哪些地方赋值:

  1. 定义的时候赋值一次

  2. 可以在静态代码块中赋值一次

public class FinalDemo {//常量:public static final修饰,名称字母全部大写,下划线连接。public static final String SCHOOL_NAME = "张三" ;public static final String SCHOOL_NAME1;static{//SCHOOL_NAME = "java";//报错SCHOOL_NAME1 = "张三1";}
}

实例变量

final 修饰变量的总规则:有且仅能被赋值一次

final 修饰实例成员变量可以在哪些地方赋值 1 次:

  1. 定义的时候赋值一次
  2. 可以在实例代码块中赋值一次
  3. 可以在每个构造器中赋值一次
public class FinalDemo {private final String name = "张三" ;private final String name1;private final String name2;{// 可以在实例代码块中赋值一次。name1 = "张三1";}//构造器赋值一次public FinalDemo(){name2 = "张三2";}public FinalDemo(String a){name2 = "张三2";}public static void main(String[] args) {FinalDemo f1 = new FinalDemo();//f1.name = "张三1"; // 第二次赋值 报错!}
}

抽象类

基本介绍

父类知道子类要完成某个功能,但是每个子类实现情况不一样

抽象方法:没有方法体,只有方法签名,必须用 abstract 修饰的方法就是抽象方法

抽象类:拥有抽象方法的类必须定义成抽象类,必须用 abstract 修饰,抽象类是为了被继承

一个类继承抽象类,必须重写抽象类的全部抽象方法,否则这个类必须定义成抽象类

public class AbstractDemo {public static void main(String[] args) {Dog d = new Dog();d.run();}
}class Dog extends Animal{@Overridepublic void run() { System.out.println("												

封装继承多态(详解)相关推荐

  1. Java基础知识之封装+继承+多态详解

    前言 这篇博客是基于Java类和对象的基础之上的相关知识点.因为特别重要且语法规则较多,所以想单独总结方便之后复习. 本篇博客涉及知识点思维导图: 目录 1.封装 2.继承 3.多态 1.封装 生活中 ...

  2. 【Java编程进阶】封装继承多态详解

    推荐学习专栏:Java 编程进阶之路[从入门到精通] 文章目录 1. 封装 2. 继承 2.1 继承的语法 2.2 子类重写父类的方法 2.3 子类隐藏父类的方法 2.4 super 关键字 2.5 ...

  3. python怎样实现封装_Python底层封装实现方法详解

    Python底层封装实现方法详解 这篇文章主要介绍了Python底层封装实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 事实上,pyth ...

  4. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

  5. c语言编程 菲薄拉,C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  6. C# 面向对象编程【多态详解】

    C# 面向对象编程[多态详解] 文章目录 C# 面向对象编程[多态详解] 1. 里氏转换 2. 多态 2.1 虚方法 3.2 抽象类 3.3 接口 1. 里氏转换 1).子类可以赋值给父类 2).如果 ...

  7. C++的三种继承方式详解

    文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...

  8. java的继承实例_java教程之java继承示例详解

    这篇文章主要介绍了java继承示例详解,需要的朋友可以参考下 什么是继承(extends)? 继承是:新定义的类是从已有的类中获取属性和方法的现象. 这个已有的类叫做父类, 从这个父类获取属性和方法的 ...

  9. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  10. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

最新文章

  1. 2.lombok系列2:lombok注解详解
  2. 关于fseek和文件ab+打开方式的问题
  3. Update item to this version和Revert to this version区别
  4. DTCC 2020 | 阿里云叶正盛:数据库2025
  5. Java中的Set对象去重
  6. linux内核的裁剪和移植实验,实验5 linux内核的裁剪移植.doc
  7. AttributeError: module 'sys' has no attribute 'maxint'
  8. python数据如何保存到excel中
  9. java基础知识体系
  10. Ubuntu安装搜狗拼音输入法(中文输入法)
  11. 有一种生活叫向死而生
  12. python3解密栅栏密码的正确方法
  13. 最详细的世界集成电路发展历史足迹
  14. qa 芯片测试_关于半导体设备测试,看这一篇就够了
  15. 连接同一局域网的打印机
  16. itest Tutorial
  17. IEEE期刊最新的影响因子
  18. latex补集怎么打
  19. 计算机老师写对联给新人,写给教师结婚幽默对联【值得收藏】
  20. UOJ #34 多项式乘法

热门文章

  1. IO流案例以及特殊操作流/对象对象序列化流/Properties集合
  2. 固态量子计算中退相干研究获进展
  3. 【RASA】TED Policy:Dialogue Transformers
  4. 众昂矿业:萤石货源紧张,价格可能上涨
  5. Python2.6下安装pip
  6. Xshell 5 配置跳板机 教程
  7. 深圳市关于加快培育数字创意产业集群的若干措施 (征求意见稿)
  8. php 微信支付闪了一下,php,_微信公众号JS API支付,安卓没有效果(会闪一下就消失了),php - phpStudy...
  9. 单链表实现队列的基本操作(入队,出队)
  10. python微信登录模块_Python清理微信僵尸粉,基于itchat模块