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.需要修改属性的访问 ...
随机推荐
- TroubleShooting笔记--快照进程sp_replupdateschema和索引重建发生冲突
今天早上服务器出现大面积的阻塞,上去排查blocking,最后大概确定的问题是: rebuild index job(243) --->blocked--->sp_replupdatesc ...
- 程序员的又一春,微信小程序带来的一个赚钱机遇
微信小程序可能是原生的机遇,在程序员面对微信小程序的恐惧中说其实也是我们程序员创业的春天或者挣外快的一个机遇. 为什么这么说呢?且听我慢慢给你分析 成本角度 你想想,会ios开发的可能只会ios,会安 ...
- IOS关于LKDBHelper实体对象映射插件运用
一 插件简介: 其github地址:https://github.com/li6185377/LKDBHelper-SQLite-ORM 全面支持 NSArray,NSDictionary, Mode ...
- CSS3学习总结3-3D与动画
前言:这是篇CSS3中关于3D效果与动画相关的内容. (1)在CSS3的3D效果中,需要结合透视perspective的属性才能看到3d的效果,这个属性在屏幕上实现了元素近大远小的效果,所以要使用CS ...
- SSIS Data Flow 的 Execution Tree 和 Data Pipeline
一,Execution Tree 执行树是数据流组件(转换和适配器)基于同步关系所建立的逻辑分组,每一个分组都是一个执行树的开始和结束,也可以将执行树理解为一个缓冲区的开始和结束,即缓冲区的整个生命周 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销
上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...
- 爆一个VS2015 Update1更新带来的编译BUG【已有解决方案】
一个编译的BUG,在原生的VS2015中没有问题,但更新至VS2015 Update1之后就有了,大概是Update1用了新的编译器,害得我好苦.经测试,VS2013 Update5中也存在这个问题, ...
- IOS数据存储之NSUserDefaults
前言: 作为从事Android开发人来说一定听说过SharedPreferences,然后要成为一名ios开发工程师来说咋能不知道NSUserDefaults!接下来让我们认识一下. NSUserDe ...
- 构建自己的PHP框架--实现Model类(3)
在之前的博客中,我们实现并完善了Model类的findOne方法,下面我们来实现其中的其他方法. 先来看findAll方法,这个方法和findOne很相似. public static functio ...
- [c++] constexpr and literal class
稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++? 2. int i; // not constant const ...