3

【学懂Java】(四)面向对象编程-3

 1 year ago
source link: https://blog.51cto.com/u_15796276/6021143
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一.代码块

使用”{}”括起来的一段代码

根据位置可分类

普通代码块:

定义在方法中的使用{}括起来的代码

public class CodeBlockDemo {
public void test(){
System.out.println("test");{
System.out.println("测试");
}
}

public static void main(String[] args) {
CodeBlockDemo codeBlockDemo = new CodeBlockDemo();//因为test是非static类型,所以不能在static的main里直接调用
codeBlockDemo.test();{
System.out.println("main");
}
}
}

【学懂Java】(四)面向对象编程-3_访问权限

构造代码块:

直接写在类中,用{}括起来的代码

public class CodeBlockDemo {
{
System.out.println("构造代码块");
}
public void test(){
System.out.println("test");{
System.out.println("测试");
}
}

public static void main(String[] args) {
CodeBlockDemo codeBlockDemo = new CodeBlockDemo();
codeBlockDemo.test();{
System.out.println("main");
}
}
}

【学懂Java】(四)面向对象编程-3_import_02

通过反编译工具我们发现它将这段代码加在了构造方法中,在创建对象时默认调用了方法进行初始化,因此先打印了构造代码块

【学懂Java】(四)面向对象编程-3_import_03

每次代码运行的时候会将构造代码块中的代码添加到每个构造方法前面,当使用this()时不会添加例如

public class CodeBlockDemo {

int a;
int b;
public CodeBlockDemo(){
System.out.println("构造方法");
}

public CodeBlockDemo(int a){
this.a=a;
}

public CodeBlockDemo(int a,int b){
this(a);
this.b=b;
}

{
System.out.println("构造代码块");
}
public void test(){
System.out.println("test");{
System.out.println("测试");
}
}

public static void main(String[] args) {
CodeBlockDemo codeBlockDemo = new CodeBlockDemo();
codeBlockDemo.test();{
System.out.println("main");
}
}
}
【学懂Java】(四)面向对象编程-3_import_04

静态代码块:

使用static声明的代码块,在程序载入的时候优先执行(意味着不需要创建对象也会执行)

  • 数据库连接等其他需要准备好的代码会放在static中
public class CodeBlockDemo {

int a;
int b;

static {
System.out.println("静态代码块");
}

public CodeBlockDemo(){
System.out.println("构造方法");
}

public CodeBlockDemo(int a){
this.a=a;
}

public CodeBlockDemo(int a,int b){
this(a);
this.b=b;
}

{
System.out.println("构造代码块");
}
public void test(){
System.out.println("test");{
System.out.println("测试");
}
}

public static void main(String[] args) {
CodeBlockDemo codeBlockDemo = new CodeBlockDemo();
codeBlockDemo.test();{
System.out.println("main");
}
}
}

【学懂Java】(四)面向对象编程-3_import_05

同步代码块:

多线程的时候会使用,用来给分享空间进行加锁操作

 ​http://mashibing.com​

北京马士兵教育

公众号:马士兵《 Java系列课程》

二.package

就是包,对应到文件就是多级管理目录

1.解决问题

  • 文件同名问题
  • 为了方便管理类,将具体处理功能的代码放到同一个目录下

一般定义package会放置在Java文件的第一行

【学懂Java】(四)面向对象编程-3_package_06

完全定义名:包名+类名

3.JDK中的主要包

  • java.lang(不需要手动导入)
  • 包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
  • java.awt
  • 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
  • java.net
  • 包含执行不网络相关的操作的类。
  • java.io
  • 包含能提供多种输入/输出功能的类。
  • java.util
  • 包含一些实用工具类,如定义系统特性、使用不日期日历相关的函数。

4.import

当需要引入非lang包的其他java类的时候,需要使用import,否则每次在使用某个类的时候都需要将类的完全限定名写上

注意:当一个java文件中需要使用多个同名的类时,只能import一个,其余的用完全限定名

  • import java.包名.类名:导入具体的类,推荐使用
  • import 包名.*:导入当前包的所有类

静态导包:

当需要使用一个或某个类的多个方法时,但又不想重复写类名时,可以使用静态导包。

import static java.lang.Math.*
...
System.out.println(sqrt(2));
System.out.println(Math.sqrt(2));
//两者效果一样

 三.封装encapsulation(面向对象四大特征)

package com.ak27;
public class Dog {
String name;
int age;
String color;
public Dog(){

}
public Dog(String name,int age,String color){
this.age=age;
this.color=color;
this.name=name;
}
public void eat(){
System.out.println("eating meat");
}

public void play(){

System.out.println("basketball");
}
public void show(){
System.out.println("name:"+this.name);
System.out.println("age:"+this.age);
System.out.println("color:"+this.color);
}
}
package com.ak27;
public class DogTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name="旺财";
dog.age=-11;
dog.color="black";
dog.show();
}
}

​dog.age=-11;​​如果任何一个处理类都可以直接对Dog进行赋值操作,那么当值不正确的时候,可能会产生额外结果。如何在赋值的同时添加逻辑判断------封装。

package com.ak27;

public class Dog {
String name;
private int age;//访问修饰符保障不是谁都可以访问赋值
String color;
public Dog(){
}
public Dog(String name,int age,String color){
this.age=age;
this.color=color;
this.name=name;
}
/*------------------------封装 --------------------------*/
public void setAge(int age){
if(age>0){
this.age = age;
}else{
System.out.println("输入年龄不规范");
}
}
/*------------------------------------------------------*/
public void eat(){
System.out.println("eating meat");
}
public void play(){

System.out.println("basketball");
}
public void show(){
System.out.println("name:"+this.name);
System.out.println("age:"+this.age);
System.out.println("color:"+this.color);
}
}
package com.ak27;
public class DogTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name="旺财";
//int age = -12;
dog.setAge(-11);
dog.color="black";
dog.show();
}
}

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

使用封装可以保障数据的规范,不符合规范的数据将无法进行操作。

1.隐藏类的内部实现细节

2.只能通过提供的方法进行访问,其他无法访问

3.可以根据需求添加复杂的逻辑判断语句

4.方便修改实现

面向对象的封装(狭义):

  • 将类中的属性设置为私有属性,提供共有的外部方法程序进行调用,可以实现丰富的细节操作

广义的封装:

  • 可以将完成特点功能的代码块封装成一个方法,供不同的程序进行调用

我们程序设计要追求“高内聚,低耦合”。

高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;

低耦合 :仅暴露少量的方法给外部使用。

package com.ak27;

public class Dog {
private String name;
private int age;
private String color;

public Dog(){
}
public Dog(String name,int age,String color){
this.age=age;
this.color=color;
this.name=name;
}

public void setAge(int age){
if(age>0){
this.age = age;
}else{
System.out.println("输入年龄不规范");
}
}

public int getAge(){
return this.age;
}

public void setName(String name){
this.name=name;
}

public String getName(){
return this.name;
}

public void setColor(String color){
this.color=color;
}

public String getColor(){
return this.color;
}

public void eat(){
System.out.println("eating meat");
}

public void play(){

System.out.println("basketball");
}

public void show(){
System.out.println("name:"+this.name);
System.out.println("age:"+this.age);
System.out.println("color:"+this.color);
}
}
package com.ak27;

public class DogTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("旺财");
dog.setAge(12);
dog.setColor("Black");
System.out.println(dog.getAge());
System.out.println(dog.getName());
System.out.println(dog.getColor());
dog.show();
}
}
【学懂Java】(四)面向对象编程-3_访问权限_07

四.Java中明确定义了访问权限

1.限制访问

  • public:共有的
  • 当前项目的所有类都可以访问
  • protected:受保护的
  • 可以被当前类访问,可以被当前包访问,也可以被子类访问
  • default:默认权限
  • 默认权限,可以被当前类访问,可以被当前包访问
  • private:私有权限
  • 只能被当前类访问
【学懂Java】(四)面向对象编程-3_访问权限_08

2.封装要点中的权限设置

类的属性的处理:

  • 一般使用private. (除非本属性确定会让子类继承)
  • 提供相应的get/set方法来访问相关属性. 这些方法通常是public,从而提供对属性的读取操作。 (注意:boolean变量的get方法是用:is开头!)

方法的属性的处理:

  • 一些只用于本类的辅助性方法可以用private,
  • 希望其他类调用的方法用public

3.利用权限了解值传递

当方法的参数值时基本数据类型的时候,不会改变原来的值

当方法的参数值是引用类型的时候,如果改变了该引用类型的值,会改变原来的对象的值

package com.ak27;

public class Change {
public static void test(Point point){
int x = point.getX();
int y = point.getY();
point.setX(y);
point.setY(x);
}

public static void main(String[] args) {
Point point =new Point(2,3);
test(point);
System.out.println(point.getX());
System.out.println(point.getY());
}
}
package com.ak27;

public class Point {
private int x;
private int y;

public Point(int x,int y){
this.x=x;
this.y=y;
}

public void setX(int x) {
this.x=x;
}

public int getX() {
return x;
}


public void setY(int y){
this.y=y;
}

public int getY(){
return y;
}
}

【学懂Java】(四)面向对象编程-3_代码块_09


Recommend

  • 93

    面向对象的 JavaScript 编程:原理与实践

  • 43

    很难说FP和OO孰优孰劣,应该依场景合理选择使用。倘若从这个角度出发,Scala就体现出好处了,毕竟它同时支持了OO和FP两种设计范式。 从设计角度看,我认为OO更强调对象的自治,即每个对象承担自己应该履行的职责。倘若在编码实现时能遵循“自治”原则,就不容易设计...

  • 29
    • sexywp.com 4 years ago
    • Cache

    :学懂回溯法

    回溯法,是算法面试和竞赛里面,最常使用的一种算法“套路”。实质上是一种“隐式图”的搜索算法,也有人说,就是一种类型的“深度优先搜索”(DFS),也是一种“递归”的典型应用,一种“枚举”法,也可以说是“暴力搜索”法。 我在 LeetCode 刷题...

  • 35
    • segmentfault.com 3 years ago
    • Cache

    一分钟带你学懂——什么是堆?

    上一篇的 「Java 集合框架」里,还剩下一个大问题没有说的,那就是 PriorityQueue,优先队列,也就是堆,Heap。 什么是堆? 堆其实就是一种特殊的队列——优先队列。 普通的队列游戏规则很简单:就是先进先出...

  • 3

    每一个人都有自己的星星,但其中的含义却因人而异。你,只有你,了解这些星星与众不同的含义。文章来源:金城漫与画 ID:jinchengmanyuhua 作者:金城 编辑:卝生 今年,是《小王子》诞生七十五周年。 听闻近期香港,有一个法国...

  • 4

    一说到学习方法,其中必有「看案例」。但很多人看案例,只是积累了案例数量,获得了见识,并没有增加见解。看完觉得都会了,等到自己做项目时毫无头绪,不知从哪儿开始。那么,看再多案例也无济于事,因为只是「知其然,不知其所以然」。《

  • 6

    V2EX  ›  程序员 Java 开发者面向对象编程?不不不,是面向 Spring 编程   shawnwang...

  • 1

    掌握模拟设计,需要学懂这四个知识-模拟/电源-与非网

  • 3

    流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。包含顺序结构、分支结构、循环结构。顺序结构不必多说。一.分支结构if语句(单分支选择结构)if语句对条件表达式...

  • 1
    • blog.51cto.com 1 year ago
    • Cache

    【学懂Java】(三)数组

    【学懂Java】(三)数组 推荐 原创 AK27先生 2023-01-16 16:50:56...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK