luogg_java学习_06_面向对象特性之封装和继承
这篇博客总结了1天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用.
**转载请注明 出自 : luogg的博客园 ** ,
因为前不久偶然发现某网站直接复制粘贴我的博客,交谈之后他们修改了出处.
封装
一, 封装的概念
- 类可以看成一个封装体,将对象的属性和方法封装到类中.
- 把不希望外界看到或调用的属性或方法用private 关键字修饰, 然后在属性或方法的类中创建一个可以间接让外部使用属性或方法的通道.
二, 封装的实现
- 通常将类中的成员变量私有化 (private) ,那么再通过这个类创建对象后就不能访问该类的变量 , 通过对外提供方法(setXxx,getXxx),可对该变量(xxx)进行访问。
- boolean 类型的变量没有 getXX,只有 isXX;
- IDE中可以右键source 快捷的设置变量的seter和geter方法
- get方法有返回值和return
- set方法无返回值,担有形参
public int getAge() {
System.out.println(name + "的年龄是 : " + age);
return age;
}
public void setAge(int age) {
this.age = age;
}
三, this关键字的作用
1. 表示本类中的(age)属性
this.age = age;
2. this([实参]); 表示在构造方法中调用构造方法. 应写在构造方法中的第一行, 不然会报错,构造方法中只能使用一次.
// 设置构造函数
public Person() {
System.out.println("这是有0个参数的构造方法");
}
public Person(String name) {
this.name = name;
System.out.println("这是有一个参数的构造方法");
}
public Person(String name , int age , char sex) {
this("张三");
System.out.println("这是有3个参数的构造方法");
}
=================
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person("",10,'男');
}
}
执行之后:
3. this表示当前对象
// this 的第三种用法:表示当前对象
====ThisPerson类=====
public void run() {
System.out.println("runing....");
System.out.println(this);
}
======主类======
ThisPerson p3 = new ThisPerson();
p3.run();
System.out.println(p3 + "\n");
执行结果:
四, 构造方法 :
创建类的对象并初始化,具体方法day04写了.
五, 类的设计分析
根据要求写出类所包含的字段;
所有的字段(属性)都必须私有化;
封装之后的字段可通过 setter 和 getter 设值和取得;
按需求可添加若干构造方法;
根据需求可添加相应的方法;
类中的所有方法都不要直接处理(输出打印),而是交给调用者去处理。
六, static(静态) 关键字的使用
- static修饰的属性或方法称为静态属性或者静态方法.
- 一旦属性或方法被static修饰,可以直接通过类名.方法()或者类名.属性调用.
- 被static修饰的方法, 程序运行后不管用不用得到都会进入内存中的静态区.
- 随着类的加载而加载, 优先于对象存在 , 被所有对象所共享 , 可以直接被类名调用
- 静态方法只能访问静态成员, 非静态方法可以访问静态方法.
- 静态方法中不可以使用this,super关键字
=====StaticPerson类中定义静态属性========
public class StaticPerson {
static String name;
int age;
char sex;
}
======主类====
public class TestStatic {
public static void main(String[] args) {
StaticPerson.name = "张三";
System.out.println(StaticPerson.name);
fun();
}
public static void fun() {
System.out.println("run..");
StaticPerson.name = "张三";
System.out.println(StaticPerson.name);
}
}
输出结果:
====================================
继承
一, 继承概念及优点
子类扩展其父类的功能,达到类的重用,降低开发成本
优点:
1、提高了代码的复用性。
2、让类与类之间产生关系,有了这个继承关系才有了多态的特性。
3、Java 语言中只支持单继承(有别于 C 语言)。因为多继承容易带来安全隐患(父类多了, 功能相同的话,就会出现调用不确定性,覆写一个方法,到底覆写的谁的?),但是java支持多层继承,即祖孙关系,祖先关系
二, 继承的实现
父类:超类,基类
子类:派生类
格式:
访问修饰符 class 子类名 extends 父类名(){}
三, 继承的限制
- 在java中只允许单继承
- 子类不能继承父类的私有成员
- 父类的构造方法也不可以继承
四, 子类对象实例化过程
1、先实例化父类构造方法为父类中的属性初始化
2、再实例化子类构造方法
实质:在子类的构造方法中隐藏了一个 super()方法,调用父类中的构造方法
=======父类======
public class Person1 {
int age = fun();
public Person1() {
System.out.println("父类的构造方法被调用了");
}
public int fun() {
System.out.println("父类属性方法被执行了");
return 0;
}
}
============子类===============
public class Person1Test extends Person1 {
int age = info();
public Person1Test() {
//super();隐藏了,它默认先调用父类的构造方法
System.out.println("子类的构造方法被执行");
}
public int info() {
System.out.println("子类的属性被执行");
return 0;
}
}
=============主函数============
public static void main(String[] args) {
Person1Test p1 = new Person1Test();
}
===输出结果=
五, super关键字的使用
1, 调用父类中的构造方法 super([参数]);
2, 调用父类中的普通方法 super.普通方法();
3, 调用父类中的属性 super.属性;
======父类Person类======
public Person() {
System.out.println("父类无参构造方法被调用");
}
public Person(String name) {
System.out.println("父类一个参数的构造方法被调用");
}
public String fun() {
System.out.println("父类中的属性被初始化了");
return name;
=========子类Student类========
public void run(int id) {
super.fun();
System.out.println("子类的属性被初始化");
}
public Student() {
super("张三");
System.out.println("子类构造方法被调用");
}
===========主函数===========
public static void main(String[] args) {
Student s1 = new Student();
s1.id = 10;
System.out.println(s1.id);
}
输出结果:
六,包及访问权限
包的使用:import 包名.子包名.* 或 import 包名.子包名.类
访问修饰符:
七, 方法的重写
当父类的某个方法不适合于子类本身的特征行为时就当覆写父类中应当改变的方法。
方法覆写时应遵循的原则(一同两小一大):
(一同):方法签名必须相同;
(两小):
子类方法的返回值类型比父类方法的返回值类型更小或相等
子类方法声明抛出的异常应比父类方法申明抛出的异常更小或相等;
(一大):子类方法的访问权限应比父类方法更大或相等;
实现规则:
(1)在子类中定义了与父类中同名的方法;
(2)方法名称、参数类型、返回值类型、全部相同
(3)并且子类中的的同名方法的访问权限不用比父类中的同名方法更严格 private访问修饰符 权限最低,最严谨
====父类====
public class Person {
public void run() {
System.out.println("父类正在跑步...");
}
}
====子类===
public class Student {
public void run() {
System.out.println("子类正在跑步!!!");
}
}
====主函数====
public static void main(String[] args) {
Student s = new Student();
s.run();
}
输出结果 : 子类正在跑步!!!
八, final 关键字的使用
作用:
(1)声明类:声明类的时候表示该类不能再被继承
(2)声明方法:声明方法的时候表示该方法不能在被子类被覆写
(3)声明变量:声明变量的时候表示该变量变成常量(常量:一旦赋值之后,里面的值不能再变)
九, 难点
重写和重载的区别
super关键字和this关键字的区别
十,语句块
普通块
写在方法里面的 (方法, if语句 switch等等)
{}
构造块
写在类里边 {}
静态块
写在类里边 static{}
执行的先后顺序 :
静态快先被执行
构造块之后被执行
构造方法最后被执行
静态块只在创建对象时候执行一次,不管创建多少个对象,只执行一次
luogg_java学习_06_面向对象特性之封装和继承的更多相关文章
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- Javascript面向对象特性实现封装、继承、接口详细案例
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)
Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...
- (转载)OC学习篇之---类的三大特性:封装,继承,多态
之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...
- 黑马程序猿——JAVA面向对象的特性:封装,继承,多态
- ----------android培训.java培训.java学习型技术博客.期待与您交流!------------ ...
- PHP其它常用函数;<<<面向对象(OPP)的三大特性:封装、继承、加态:>>> <----面试题 ;构造方法、析构方法,魔术方法、set、get方法;静态;抽象类;接口
PHP其它常用函数: 赋值:$r->name = "元素"; 取值: echo $r->name; count() 计算数组中的元素数目或对象中 ...
- .NET面向对象特性之封装
.NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...
- Python 面向对象的三大特性:封装,继承,多态
# 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到 ...
- java三大特性(封装、继承、多态)
oop(面向对象程序设计)具有三大特性:封装.继承.多态 一.封装 封装就是讲类的信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类的实现隐藏信息的操作和访问. 实现封装 1.需要修改属性的访问 ...
随机推荐
- ios 避免循环引用
类似网络请求的情况下会导致循环引用,但是 如果网络请求的对象是局部变量,就必须用self,不能用weakSelf,否则,一旦当前方法所在对象销毁,那weakSelf就为空了(如果目的是这样,那就另当别 ...
- Step by Step 创建一个新的Dynamics CRM Organization
原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...
- [大数据之Spark]——Transformations转换入门经典实例
Spark相比于Mapreduce的一大优势就是提供了很多的方法,可以直接使用:另一个优势就是执行速度快,这要得益于DAG的调度,想要理解这个调度规则,还要理解函数之间的依赖关系. 本篇就着重描述下S ...
- Rabbitmq安装与配置
install: 1.安装Erlang: $yum -y install erlang 2.安装rabbitmq-server: $rpm --import https://www.rabbitmq. ...
- thinphp框架的项目svn重新检出后的必备配置
刚刚试着去了解thinkphp框架,在这里做一些笔记,后续有新的总结会更新到这里,如有错误与遗漏,望大家指正. 用thinkphp框架的项目,在用svn重新检出之后,需要进行一些基本配置,方可在本地打 ...
- 【初恋】vue单页应用开发总结
vue新人,没有高级技巧 本文主要总结了使用vue-cli脚手架安装开发环境,使用vue.js等进行单页应用开发所遇问题的总结. 技术栈: Vue v1.0.21, vue-resource v0.9 ...
- C#设计模式系列:代理模式(Proxy)
代理模式提供了一个中介控制对某个对象的访问.现实生活中,我们可能会用支票在市场交易中用来代替现金,支票就是账户中资金的代理. 1.代理模式简介 1.1>.定义 代理模式(Proxy)定义:代理模 ...
- 【Win10应用开发】相对布局(RelativePanel)
外面的雨下得很大,老周就决定雨下漫笔了. 今天咱们说一个新控件——RelativePanel.本质上,它就是一个面板,面板干啥用的?面板就是一个容器,里面可以放其他对象,就像我们小时候玩的七巧板一样, ...
- 【转】WPF防止界面卡死并显示加载中效果
原文地址:http://www.cnblogs.com/linyijia/archive/2013/02/06/2900609.html <Window x:Class="Loadin ...
- Eclipse迁移到Android studio步骤如下:
一.从Eclipse中导出:1.将你的ADT插件版本升级到22.0以上.2.在Eclipse中,选择File-->Export.3.在弹出的导出窗口中,打开Android的文件夹,选择“Gene ...