Java学习笔记之---面向对象
Java学习笔记之---面向对象
(一)封装
(1)封装的优点
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
(2)实现封装的步骤
1. 修改属性的可见性来限制对属性的访问(一般限制为private)
private String sex;
2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
public void setSex(String s){
this.sex=s;
}
public String getSex(){
return sex;
}
3.可以在set方法中添加条件
public void setSex(String s){
if(sex=="男"||sex=="女"){
sex=s;
}else{
sex="男";
}
}
public String getSex(){
return sex;
}
(3)封装实例
public class Dog {
String name;
String color;
int age;
private String sex;
public void setSex(String s){
if(sex=="男"||sex=="女"){
sex=s;
}else{
sex="男";
}
}
public String getSex(){
return sex;
}
public void eat(){
System.out.println("吃饭");
}
}
class test{
public static void main(String[] args){
Dog dog3=new Dog();
dog3.name="cc";
dog3.age=100;
dog3.setSex("男");
dog3.eat();
System.out.println("狗3的性别为:"+dog3.getSex());
}
}
(二)继承
(1)什么是继承
- 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
(2)继承格式
class 父类 { }
class 子类 extends 父类 { }
(3)继承的优点
- 减少代码的重复,使代码更加整洁
- 提高维护性
- 提高代码的复用性
(4)继承的类型
- 单继承
- 多重继承
- 不同类继承同一个类
- 一个类不能继承多个类
(5)继承的特性
- 父类中的构造方法不能被继承,如果父类中有无参构造方法子类中也要有
- 子类可以继承父类的属性和方法
- 子类继承父类的方法后可以进行重写
- 父类中私有的不能被继承
(6)继承实例
public class Office {
public void print(){
System.out.println("打印");
}
}
public class Excel extends Office {
public void print(){
System.out.println("Excel打印");
}
}
(三)多态
(1)什么是多态
- 多态是同一个行为具有多个不同表现形式或形态的能力。
- 多态就是同一个接口,使用不同的实例而执行不同操作
- 多态性是对象多种表现形式的体现
(2)多态的优点
1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性
(3)多态存在的必要条件
1.继承 2.重写 3.父类引用指向子类对象
(4)多态实例
1.创建一个父类和两个子类,子类继承父类的属性和方法
public class Animal {
String name;
String age;
public void eat(){
System.out.println("吃饭");
}
}
public class Cat extends Animal {
}
public class Dog extends Animal {
}
2.子类对父类方法进行重写
public class Dog extends Animal {
public void eat(){
System.out.println("狗吃饭");
}
}
public class Cat extends Animal {
public void eat(){
System.out.println("猫吃饭");
}
}
3.父类引用指向子类对象
class test{
public static void main(String[] args){
Animal a=new Cat();
}
}
4.整体实例
public class Animal {
String name;
String age;
public void eat(){
System.out.println("吃饭");
}
}
class test{
public static void main(String[] args){
//向上转型,隐式转型,自动转型,父类引用指向子类对象,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法
Animal a=new Cat();// 向上转型
a.eat(); // 调用的是 Cat 的 eat
//向下转型,强制类型转换,子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法
Cat b=(Cat) a; // 向下转型
b.eat();// 调用的是 Cat 的 eat
show(new Dog());// 以 Dog 对象调用 show 方法
}
public static void show(Animal n){
if(n instanceof Cat){
Cat c=(Cat)n;
c.eat();
}else if(n instanceof Dog){
Dog c=(Dog)n;
c.eat();
}
}
}
public class Dog extends Animal {
public void eat(){
System.out.println("狗吃饭");
}
}
public class Cat extends Animal {
public void eat(){
System.out.println("猫吃饭");
}
}
(四)抽象类
(1)什么是抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
(2)关键字
abstract
(3)抽象方法
- 如果一个类包含抽象方法,那么该类必须是抽象类。
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类
(4)抽象类的规则
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能,抽象方法以分号结尾;
- 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
- static,final,private不能与abstract并存
(5)抽象类实例
public abstract class Animal {
String name;
String age;
public abstract void eat();
}
public class Cat extends Animal {
public void eat(){
System.out.println("猫吃饭");
}
}
(五)接口
(1)什么是接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法
(2)关键字
interface implement
(3)接口与类的相似点
- 一个接口可以有多个方法。
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
- 接口的字节码文件保存在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
(4)接口与类的区别
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
(5)接口与抽象类的区别
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
(6)接口的特性
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
- 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
- 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
- 接口中的方法都是公有的。
- 接口中的方法如果想有方法体,可以借助default或者static实现
(7)接口的实例
public interface Housekeeping {
public void bark();
}
public class Dog implements Housekeeping {
public void bark(){
System.out.println("看见坏人会叫");
}
}
(六)封装--继承--多态--抽象类--接口实例
1.封装
public class Animal {
private String name;
private String color;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setColor(String color){
this.color=color;
}
public String getColor(){
return color;
}
public void eat(){
System.out.println("吃饭");
}
}
class test{
public static void main(String[] args){
Animal a=new Animal();
a.setName("aa");
a.setColor("red");
a.eat();
}
}
运行结果:吃饭
2.继承
public class Animal {
private String name;
private String color;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setColor(String color){
this.color=color;
}
public String getColor(){
return color;
}
public void eat(String name){
System.out.println(name+"吃饭");
}
}
class test{
public static void main(String[] args){
Animal a=new Animal();
a.setName("aa");
a.setColor("red");
a.eat(a.getName());
Cat b=new Cat();
b.setName("bb");
b.setColor("blue");
b.eat(b.getName());
}
}
public class Cat extends Animal{
public void eat(String name){
System.out.println("猫"+name+"在吃饭");
}
}
运行结果:
aa吃饭
猫bb吃饭
3.多态
public class Animal {
private String name;
private String color;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setColor(String color){
this.color=color;
}
public String getColor(){
return color;
}
public void eat(String name){
System.out.println(name+"吃饭");
}
}
class test{
public static void main(String[] args){
Animal a=new Animal();
a.setName("aa");
a.setColor("red");
a.eat(a.getName());
Cat b=new Cat();
b.setName("bb");
b.setColor("blue");
b.eat(b.getName());
Animal c=new Cat();
c.setName("cc");
c.setColor("yellow");
c.eat(c.getName());
Cat d=(Cat)c;
d.eat(d.getName());
}
}
public class Cat extends Animal{
public void eat(String name){
System.out.println("猫"+name+"在吃饭");
}
}
运行结果:
aa吃饭
猫bb在吃饭
猫cc在吃饭
猫cc在吃饭
4.抽象类
public abstract class Animal {
private String name;
private String color;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setColor(String color){
this.color=color;
}
public String getColor(){
return color;
}
public void eat(String name){
System.out.println(name+"吃饭");
}
public abstract void sleep();
}
class test{
public static void main(String[] args){
Cat b=new Cat();
b.setName("bb");
b.setColor("blue");
b.eat(b.getName());
Animal c=new Cat();
c.setName("cc");
c.setColor("yellow");
c.eat(c.getName());
c.sleep();
Cat d=(Cat)c;
d.eat(d.getName());
d.sleep();
}
}
public class Cat extends Animal{
public void eat(String name){
System.out.println("猫"+name+"在吃饭");
}
public void sleep(){
System.out.println("猫在睡觉");
}
}
运行结果: 猫bb在吃饭 猫cc在吃饭 猫在睡觉 猫cc在吃饭 猫在睡觉 5.接口
public abstract class Animal {
private String name;
private String color;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setColor(String color){
this.color=color;
}
public String getColor(){
return color;
}
public void eat(String name){
System.out.println(name+"吃饭");
}
public abstract void sleep();
}
class test{
public static void main(String[] args){
Cat b=new Cat();
b.setName("bb");
b.setColor("blue");
b.eat(b.getName());
Animal c=new Cat();
c.setName("cc");
c.setColor("yellow");
c.eat(c.getName());
c.sleep();
((Cat) c).dark();
Cat d=(Cat)c;
d.eat(d.getName());
d.sleep();
d.dark();
}
}
public interface Housekeeping {
public void dark();
}
public class Cat extends Animal implements Housekeeping{
public void eat(String name){
System.out.println("猫"+name+"在吃饭");
}
public void sleep(){
System.out.println("猫在睡觉");
}
public void dark(){
System.out.println("猫在叫");
}
}
运行结果:
猫bb在吃饭
猫cc在吃饭
猫在睡觉
猫在叫
猫cc在吃饭
猫在睡觉
猫在叫
Java学习笔记之---面向对象的更多相关文章
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...
- 【原】Java学习笔记019 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 仔细想一想,Ani ...
- Java学习笔记--关于面向对象的思考
1.不可改变的类生成对象以及变量的范围 2. 关键词this的使用 3.用类抽象的思想制作软件 4.通过关系模型建立类 5.使用面向对象的范例来设计程序,遵循类设计指导. 已经学习了:怎么定义类已经创 ...
- 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器
Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...
- java 学习笔记2 面向对象(上)
类和对象 类是某一批对象的抽象,可以把类理解成某种概念.对象是一个具体存在的实体.类和对象是面向对象的核心. 类定义的是多个实例的特征,类不是具体存在,实例才是具体存在. 定义类(class)的语法: ...
- 【原】Java学习笔记016 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // this 关键字 ...
- 【原】Java学习笔记014 - 面向对象
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 面向对象思想 // ...
- Java学习笔记之面向对象
面向对象概念 面向对象编程 &面向过程编程 面向对象:关心是谁来做 面向过程:关心的是怎么做 面向对象总结成一句话:就是分工与协作,干活的是对象 生活中: 对象 -----抽象-------- ...
随机推荐
- ADB 基础命令使用
1.adb shell(>=2个设备显示:error: more than one device/emulator,仅连接一个设备可用) adb -d shell 只运行在真实设备中 adb - ...
- 浅谈.NET(C#)与Windows用户账户信息的获取
原文:浅谈.NET(C#)与Windows用户账户信息的获取 目录 1. 用户账户名称 - 使用Environment类 2. 用户账户信息 - 使用WindowsIdentity和IdentityR ...
- C# 中使用OPenCV(Emgu)心得
原文:C# 中使用OPenCV(Emgu)心得 首先介绍一下自己的情况,2010年的3月份开始接触学习C#编程,之前C#和OpenCV都是零基础,由于全都是自学进度比较慢,中间也走了不少弯路.进过三个 ...
- 使用MSYS2环境中编译Qt5.5.0的补丁
Qt的configure脚本对MinGW静态编译支持不太完善,总有这样那样的问题.如果你不嫌麻烦,而且可以接受高版本的Qt的话,可以考虑使用我做的补丁在MSYS2环境中编译.Qt5.4.2的补丁 Qt ...
- Qt+QZXing编写识别二维码的程序
本人最近在用Qt编写程序,需要用编写二维码识别功能.在网上搜寻一番,找到了QZXing.配置过程中确实出了一大把汗,这里我写这篇文章记录配置方法,替后人省一把汗吧!我的开发环境:MSVC2010 + ...
- 浅析 C++ 调用 Python 模块
浅析 C++ 调用 Python 模块 作为一种胶水语言,Python 能够很容易地调用 C . C++ 等语言,也能够通过其他语言调用 Python 的模块. Python 提供了 C++ 库,使得 ...
- Codility---BinaryGap
Task description A binary gap within a positive integer N is any maximal sequence of consecutive zer ...
- ab fails to connect to localhost
The following command fails: $ ab -n 1 localhost:8000/ ... Benchmarking localhost (be patient)...apr ...
- Ajax中post与get的区别
get和post都是向服务器发送一种请求,只是发送机制不同 . 1. GET可以通过在请求URL上添加请求参数, 而POST请求则是作为HTTP消息的实体内容发送给WEB服务器. 2. get方式请求 ...
- Java动态规划
1. 介绍 动态规划典型的被用于优化递归算法,因为它们倾向于以指数的方式进行扩展.动态规划主要思想是将复杂问题(带有许多递归调用)分解为更小的子问题,然后将它们保存到内存中,这样我们就不必在每次使用它 ...